Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 关于在数据库中存储某些实体属性的天真问题_Database Design - Fatal编程技术网

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

Database design 关于在数据库中存储某些实体属性的天真问题,database-design,Database Design,我正在设计一个以数据库为中心的web应用程序。我注意到一些实体具有属性,这些属性不用于选择、排序和分组。它们只是简单明了的数据持有者,存储在数据库中,并由GUI更新,例如。G实体用户中的属性中间名 因此,我计划将所有这些属性作为字符串(JSON格式)存储在varchar字段中。我认为它使数据访问层更简单,因为我不需要每个实体的所有JSON到SQL/从SQL转换。另外的好处是添加/删除这些属性,而不改变数据库模式。这有意义吗?我认为单一的varchar不是一个好主意。我猜你打算在最后加上新的?这将

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


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

我认为单一的varchar不是一个好主意。我猜你打算在最后加上新的?这将使数据更新/删除变得非常困难

EDIT-(谢谢!)-您的情况并不是独一无二的,这是一种称为EAV(实体属性值)的常见策略,我自己和许多其他人一起使用它。它的实现方式各不相同,我在下面建议了一种,希望能对您有所帮助

请尝试以下表格结构:

实体
身份证,姓名

属性-示例(3,“中间名”)
id,名称,[内容类型],[选择类型],[父项]

属性值-示例(1,3,'Xavier')
id,属性\u id,值

实体到属性值
id、实体id、属性值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
我在属性上列出了以下几个可选字段

内容类型

这可以作为另一个表的枚举或外键来完成。可以指示数字、正数、字符串,例如。用于验证输入,因为
value
是一个varchar,将允许任何操作

选择类型

可以指示用户是否输入他们想要的内容(创建新属性值),是否仅从您已经设置的内容中选择一个,或者是否选择一个或多个您已经设置的内容。在表单输入页面上,这将指示表单元素的类型(输入、选择、选择w/多个)

家长

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


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

您提到了一个“附加好处”。在你看来,还有什么好处?你能列举一下你所看到的吗?这可能会给回复者更多的信息。(提示:我看不出有什么好处。)虽然在不改变模式的情况下添加/删除这些属性很容易,但这确实不应该是一个问题。你所做的是增加额外的开销-如果你只需要一个中间名怎么办?现在您需要从数据库中拖出这个巨大的字段块,并对其进行解析,以获得中间名。如果以后的用户想要更新他们的中间名,你必须把整个名字拉下来,解析它,呈现它,然后上传,把整个名字拉下来,替换中间名,然后重新加载,这会增加更新/更改字段的复杂性。另一种方法是创建属性表(AttributeID、AttributeName、AttributeValue、UserID)。通过这种方式,您可以下拉与用户ID关联的所有记录,然后将它们放入字典中以查找特定属性。它可以无限扩展-只需为任何内容添加一个新的AttributeName。如果删除该记录,就好像该属性不存在一样(这就是ASP.NET配置文件提供程序默认设置的外观)@Paul:我认为将属性存储为JSON blob可以简化数据访问层,因为我不需要所有JSON到SQL的转换。(我已经更新了问题)@Prescott。感谢您建议改用属性表。这可能是一个好主意,因为我可以只编写一次与属性表的JSON转换,并在我的应用程序中重复使用。只需添加一点-此技术/方案称为“EAV”(实体属性值)所以OP可以查找更多信息,如果他希望soyes我应该添加这些信息。从标题中推测,他已经知道并正在寻求实现方面的帮助,但现在你提到了,他没有确切地说出它的名称。谢谢Nox-我将在中编辑它以使其更加明显。谢谢,Nox和Darkstar!我不知道这个EAV te技术。