EAV如何存储额外的字段值?

时间:2015-11-09 09:07:56

标签: mysql sql database entity-attribute-value

我在数据库和表格中有一个EAV结构:attribute(id,parent_id,code,name)value(id,entity_id,attribute_id,value)

我使用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

1 个答案:

答案 0 :(得分: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一样灵活,但更易于阅读,更易于维护和评估。