2015-11-09 4 views
1

У меня есть структура EAV в БД и таблицах: attribute(id,parent_id,code,name) и value(id,entity_id,attribute_id,value).EAV как сохранить дополнительную ценность поля?

Я использую parent_id для сохранения списка атрибутов. Например,

id | parent_id | code | name 
1 | null | color_id | Color 
2 | 1 | null | Red 
3 | 1 | null | Blue 
4 | 1 | null | Other 

Теперь мне нужна возможность хранить разные данные для выбора определенного элемента. Это может быть один или несколько входов. Например:

Color: 
(o) Red 
(o) Blue 
(o) Other (please specify) ______________ 

Как сохранить его? Создать дополнительную таблицу или может храниться с parent_id, указывающим на выбранный элемент или что-то еще?

id | parent_id | code | name 
4 | 1 | null | Other 
5 | 4 | other_one | First text value 
6 | 4 | other_two | Second text value 
+0

Вы изобретаете XML ... :-) Чем более вы гибки, тем больше боли в шее ... Если вы придерживаетесь этой структуры, вы скоро попадете в ад ... EAV - это очень опасный подход. Иерархический EAV - это то, что я бы даже не коснулся ... – Shnugo

+1

Так как опция «Другой» вашего примера эффективно говорит «введите что-то обычное, не связанное с материалом, который у нас есть в базе данных» - это означает исключение из правила вытаскивая из дБ. В этом исключительном случае использования я бы (лично, так что это не факт, а мнение) использует дополнительную таблицу для хранения этих входных значений пользователя. – Mjh

ответ

0

Думал немного об этом ... Вот попытка дать ответ на вопрос: «Как хранить его»:

Убедитесь, что, что вы получите частичную структуру в вашей концепции. Определите типы типов, пакеты значений, вещи, которые принадлежат друг другу и используют XML. Что-то вроде выше может локе как:

<settings> 
    <parent id="1"> 
     <colors> 
     <color>Red</color> --here you should think of tags to set the meaning of the color... 
     <color>Red</color> 
     <color>Other</color> --here you set whatever color you want 
     </colors> 
    </parent> 
    <parent id="2"> 
    -- Your example with the "First text value" gives me this idea: 
     <colors> 
     <color meaning="BackColor">Red</color> 
     <color meaning="BorderColor">Red</color> 
     <color meaning="First text value">Blue</color> 
     <color meaning="Second text value">Green</color> 
     </colors> 
    </parent> 
</settings> 

Поэтому мое предложение:

Попытка определить определенные типы, как «FormColor» и пусть это будет как

<FormColor backcolor="Red" forecolor="blue" first_text="green"> 
    --You may add specialities within the FormColor-element 
    <SpecialColor meaning="SomeSpecialMeaning">Blue</SpecialColor> 
</FormColor> 

Место этих «типов» в рамках родительский элемент. Вы можете легко выбрать родительский элемент через id и прочитать его внутренний XML. Там вы найдете все, что вам нужно ...

При таком подходе вы так же гибки, как и ваша вещь EAV, но гораздо лучше читаемы, поддерживаемы и лучше оцениваете.

+1

Как XML точно связан с ** реляционной базой данных **? – Mjh

+0

Я не работаю с MySQL (скорее, SQL Server), но он должен быть примерно одинаковым: вы определяете столбец в одной из ваших таблиц, либо строкового типа, либо - если существует - специальный тип XML. XML - это не что иное, как простой текст ... Вы можете делать манипуляции в своей базе данных или в своем приложении или смешивать оба ... – Shnugo

+0

Это не работает. – Mjh

Смежные вопросы