我正在设计一个以数据库为中心的Web应用程序。我注意到一些实体具有属性,这些属性不用于选择,排序和分组。它们只是简单明了的数据持有者,存储在数据库中并通过GUI更新,例如。 G。实体Middle Name
中的属性User
。
因此,我计划将所有这些属性作为字符串存储在varchar
字段中(采用JSON格式)。我认为它使数据访问层更简单,因为我不需要为每个实体进行SQL转换的所有JSON。其他好处是添加/删除这些属性而不改变数据库模式。它有意义吗?
答案 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,valueentity_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表单时,您需要为所有属性创建元素,添加新元素就像表格中的一行一样简单。