Совет в проектировании бд

blackandwhitetux
Дата: 19.12.2012 12:59:28
Описание ситуации:
Требуется таблица вида

id | color | shade

"color" может быть одним из заранее перечисленных цветов "красный, зеленый, синий, белый" и т.д.
"shade" может иметь набор значений из заранее заданных, однако список заранее заданных значений отличается для разных цветов.
То есть на выходе хочется получать нечто подобное
id | red | dark red, brown red
id | green | lime, light green
id | blue | normal blue
id | green | dark green

Вопрос в том, как лучше хранить эти данные? Для столбца shade не хочется использовать set, т.к. в нем придется перечислить вообще все возможные оттенки. Хочется иметь 1) mainTable 2) таблицу цветов 3) таблицы оттенков для каждых цветов. И вот с третьим столбцом и возникает непонимание :)
Если делать каждую подтаблицу оттенков для каждого цвета вида "id | shade" непонятно как заносить набор значений в основную таблицу. Можно таблицу оттенков сделать как "id | set(shades)" но тогда при записи
id | id_color | id_shade
как узнать, из какой именно таблицы оттенков брать значение, ведь выбор таблицы зависит от id_color.
Можно еще сделать оттенки как id | set(shades) | id_mainTable, но тогда третий столбец из основной таблицы можно убрать, и при записи делать 2 insert'а - в mainTable, и следом в таблицу оттенков выбранного цвета, используя id вставленной ранее строки. Но я не уверен что это правильный способ :)

Какие-нибудь советы? Или тыканье носом в неизвестный мне функционал, который позволит "нативно" организовать это? :)
tanglir
Дата: 19.12.2012 13:07:01
blackandwhitetux, не пойму, чем вас
basecolors(id,name)
colors(id,basecolorid,shade)
maintable(id,...,colorid)
не устраивает? Заранее первые 2 таблицы заполнить допустимыми полями, и всё.
tanglir
Дата: 19.12.2012 13:07:52
tanglir
допустимыми полями
допустимыми значениями, конечно же.
blackandwhitetux
Дата: 19.12.2012 13:14:04
tanglir
blackandwhitetux, не пойму, чем вас
colors(id,basecolorid,shade)
[/src]не устраивает? Заранее первые 2 таблицы заполнить допустимыми полями, и всё.


То есть вбить
basecolor
1 | red
...

colors
1 | 1 | dark red
2 | 1 | normal red
3 | 1 | light red
?

Но как тогда в основной сделать запись вида "red - dark red,light red" ?
tanglir
Дата: 19.12.2012 13:23:36
blackandwhitetux
Но как тогда в основной сделать запись вида "red - dark red,light red" ?
а зачем там такая запись? чтобы потом искать "удобнее" было? вообще-то для такого можно использовать group_concat()
blackandwhitetux
Дата: 19.12.2012 14:12:59
Я наверно не совсем четко сформулировал, указав в первом посте 2 записи green.
В maintable постоянно будут добавляться записи пользователями
tanglir
Дата: 19.12.2012 17:08:07
blackandwhitetux
В maintable постоянно будут добавляться записи пользователями
Так что должно быть в тех записях-то?
blackandwhitetux
Дата: 20.12.2012 05:00:51
id | цвет | оттенок

Пользователь выбирает цвет из заранее заданных, и оттенок из заранее заданных для этого цвета
blackandwhitetux
Дата: 20.12.2012 05:27:36
blackandwhitetux
id | цвет | оттенок

Пользователь выбирает цвет из заранее заданных, и оттенок из заранее заданных для этого цвета

"Оттенки" (не нашел как здесь редактировать сообщение :) )
tanglir
Дата: 20.12.2012 05:57:07
blackandwhitetux, делайте несколько записей в maintable, по одной для каждого оттенка.
+
В моей структуре туда придётся писать даже не 2 поля, а только одно - idcolor. Заодно и проблема неверных сочетаний "цвет-оттенок" всплывать не будет.
Иначе потом захотите сделать поиск... и начнёте увлекательное путешествие по граблям :)