如何为未知数量的元数据设计数据库

时间:2009-01-14 20:34:54

标签: database database-design schema entity-attribute-value

我想在数据库中存储具有可变数量属性的某些项目。

例如:

项目可以包含'url'和'pdf'属性,而其他项目则不具有'image'和'location'属性。

所以问题是有些物品可能有一些属性而其他物品很多。

您将如何设计此数据库?如何使其可搜索和高效?

架构会是什么样的?

谢谢!

9 个答案:

答案 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)

我过去设计的这样的表有以下字段:

  1. ID
  2. 亚型
  3. 然后我会有另一个表定义所使用的类型和子类型,并可能为该类型和子类型组合提供数据类型,以便您可以以编程方式强制执行它。

    它不漂亮,除非必须,否则你不想这样做。但这是我找到的最佳方式。

    更新:即使你将子类型留空,我发现它是一件好事,因为它经常要你将已经存在的东西分类。您创建类型:地址的示例,现在您需要邮寄地址和帐单地址以及实际地址。

答案 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。

高性能?不知道。