我想在数据库中存储具有可变数量属性的某些项目。
例如:
项目可以包含'url'和'pdf'属性,而其他项目则不具有'image'和'location'属性。
所以问题是有些物品可能有一些属性而其他物品很多。
您将如何设计此数据库?如何使其可搜索和高效?
架构会是什么样的?
谢谢!
答案 0 :(得分:8)
你所追求的是一个名字 - Entity Attribute Value (EAV)。它是“一种数据模型,用于可用于描述事物(”实体“或”对象“)的属性(属性,参数)的数量可能非常大的情况,但数量这实际上适用于给定的实体是相对适度的。“
答案 1 :(得分:2)
如果您不一定与SQL绑定,则triple store专门用于此任务。大多数都是使用SPARQL查询语言进行查询的。
答案 2 :(得分:1)
这听起来像是文档数据库的完美工作。
答案 3 :(得分:0)
从您的对象(项目)开始,并为项目创建一个表格。您的商品可以包含1个或多个属性,或者根本没有属性?因此,设置一个具有唯一ID的属性表。现在设置一个包含许多项目的表(一些可以复制)和许多属性(也可以复制)
<强>物品强>
的ItemID
ItemDescription ...
<强>属性强>
属性Id
AttributeDescription ...
<强> ItemAttributes中强>
ROWID
的ItemID
属性Id
现在,当您想要查询时,您可以简单地加入表格并过滤您想要的...
答案 4 :(得分:0)
实体属性值(EAV)模型非常灵活。语义网及其查询语言sparql也基于EAV。但有些人不喜欢它,因为这种模式会对性能造成影响。
首先对数据库进行一些高负载性能测试。完成编码后不要这样做,因为那时已经太晚了。
编辑:专注于您选择语句的速度。用户希望在搜索时获得快速结果。
答案 5 :(得分:-1)
我过去设计的这样的表有以下字段:
然后我会有另一个表定义所使用的类型和子类型,并可能为该类型和子类型组合提供数据类型,以便您可以以编程方式强制执行它。
它不漂亮,除非必须,否则你不想这样做。但这是我找到的最佳方式。
更新:即使你将子类型留空,我发现它是一件好事,因为它经常要你将已经存在的东西分类。您创建类型:地址的示例,现在您需要邮寄地址和帐单地址以及实际地址。
答案 6 :(得分:-1)
对于这种情况,我使用MS SQL 2005中的XML类型列... 您将拥有XML + SQL的所有优势。这是使用XPath表达式作为SQL语句的一部分。
这是MS SQL 2005的一个功能,我不确定哪个其他RDBMS支持这个。 我不确定性能的影响是什么。
答案 7 :(得分:-2)
使用以下字段创建属性表:
item_id int(或项目表中的ID类型) property_name varchar(500) property_value varchar(500)
在item_id和项目的id字段之间设置一个外键,你就完成了。
这就是你在SQL中建立多对一关系的方式。
答案 8 :(得分:-2)
看起来像带有主键“item_id”的“items”表,带有主键“property_id”的“properties”表和带有“items”表的外键“item_id”。 “properties”将包含“name”和“value”列,两者都是varchar。
高性能?不知道。