关于在数据库中存储一些实体属性的天真问题

时间:2010-12-19 08:13:22

标签: database-design

我正在设计一个以数据库为中心的Web应用程序。我注意到一些实体具有属性,这些属性不用于选择,排序和分组。它们只是简单明了的数据持有者,存储在数据库中并通过GUI更新,例如。 G。实体Middle Name中的属性User

因此,我计划将所有这些属性作为字符串存储在varchar字段中(采用JSON格式)。我认为它使数据访问层更简单,因为我不需要为每个实体进行SQL转换的所有JSON。其他好处是添加/删除这些属性而不改变数据库模式。它有意义吗?

1 个答案:

答案 0 :(得分:2)

我不认为单个varchar是个好主意。我想你打算最后添加新的?它会使supdating /删除变得非常困难。

编辑 - (感谢nox!) - 您的情况不是唯一的,它是一种称为EAV(entity-attribute-value)的常见策略,我自己和其他许多人一起使用它。 http://en.wikipedia.org/wiki/Entity-attribute-value_model它的实现各不相同,我在下面提出了一个我希望可以为你工作的建议。

尝试以下表格结构:

  

实体
  id,name,.....

     

属性 - 示例(3,'中间名')
  id,name,[content_type],[choice_type],[parent]

     

attribute_value - 示例(1,3,'Xavier')
  id,attribute_id,value

     

entity_to_attribute_value
  id,entity_id,attribute_value_id

获取X的属性:

SELECT *
FROM attribute A 
   LEFT JOIN attribute_value AV on AV.attribute_id = A.id
   INNER JOIN entity_to_attribute_value ETAV on ETAV.attribute_value_id = AV.id
WHERE ETAV.entity_id = X

我列出了以下

属性的几个可选字段

content_type
这可以作为另一个表的枚举或外键来完成。可以表示数字,正数,字符串,ex。用于验证输入,因为value是一个varchar并且允许任何内容

choice_type
可以指示用户是否输入他们想要的内容(创建新的attribute_value),只选择您已设置的那些,或者选择您已经设置的一个或多个。在表单输入页面上,这将指示表单元素的类型(输入,选择,选择多个)

parent
例如,指向它们之间的层次关系的另一个属性,例如国家和州。这可能会影响表单页面上的显示和逻辑。

生成GUI表单时,您需要为所有属性创建元素,添加新元素就像表格中的一行一样简单。