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

问题描述:

我想用数量可变的属性在数据库中存储某些项目。如何为未知数量的'元数据'设计数据库

例如:

一个项目可以有“URL”和“PDF”财产既别人不连接,而不是有“形象”和“位置”属性。

所以问题是一些项目可以有一些属性和其他很多。

你将如何设计这个数据库。如何使其可搜索和高性能?

模式将是什么样子?

谢谢!

+0

请考虑http://stackoverflow.com/questions/296563/how-to-make-up-for-lack-of-a-computer-science-degree#296902。 – 2009-01-19 20:57:41

你有什么名字 - Entity Attribute Value (EAV)。它是“一种数据模型,用于可用于描述事物(”实体“或”对象“)的属性数量(属性,参数)可能非常大的情况,但数量实际上适用于给定的实体是比较适中的。“

+0

我不确定OP是否说它必须是EAV - 属性可能是可变的,但是取自一个大的(已知)集合,在这种情况下,特定属性组的专用表可能会更好。 – finnw 2009-01-14 20:50:21

+0

从阅读说明,这听起来像我所需要的。但大多数时候,我不喜欢cs-theory对维基百科的解释(没有冒犯性)。它在实践中并没有帮助我,虽然它可能会非常有趣......无论如何... :-) – 2009-01-14 20:55:47

+0

有时候,有一半的战斗是知道什么叫做什么。它有助于沟通,并指导进一步的搜索! – 2009-01-14 22:17:14

具有以下字段创建一个属性表:

ITEM_ID INT(或任何ID类型是在项目表) PROPERTY_NAME VARCHAR(500) PROPERTY_VALUE VARCHAR(500)

设置一个外国item_id和项目的id字段之间的关键,你就完成了。

这就是你如何在SQL中进行多对一的关系。

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

  1. ID
  2. 亚型

然后,我将有另一将定义所使用的类型和子类型的表,并可能为该类型和子类型组合提供数据类型,以便您可以编强制执行它。

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

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

+0

任何人都在意评论我为什么被低估?我的回答错了吗?我误解了这个问题吗? – 2009-01-15 19:28:02

看起来像一个带有主键“item_id”的“items”表,主键为“property_id”的“properties”表和带有“items”表的外键“item_id”。 “属性”将具有类型varchar的列“名称”和“值”。

表演?不知道。

从您的对象(item)开始,为项目创建一个表格。你的物品可以有1个或多个属性,或者没有任何属性?因此,建立一个具有唯一ID的属性表。现在设置包含许多项目(有些可以复制)和许多属性(可以复制和)

项目

项目ID

ItemDescription 表...

属性

属性ID

AttributeDescription ...

ItemAttributes中

ROWID

项目ID

属性Id

现在,当你想查询你可以简单地加入表和筛选但是你的愿望...

这听起来像是一个完美的文档数据库工作。

如果您不一定与SQL绑定,那么triple store就是专门为此任务设计的。大多数设计用于查询SPARQL查询语言。

对于这种情况,我使用MS SQL 2005中的XML类型列... 您将拥有XML + SQL的所有优点。这是使用XPath表达式作为SQL语句的一部分。

这是MS SQL 2005的一个特性,我不确定哪个RDBMS支持这个。 我不确定什么影响是性能明智的。

实体属性值(EAV)模型非常灵活。语义Web及其查询语言sparql也基于EAV。但有些人不喜欢它,因为这种模式会有性能损失。

从对数据库执行一些高负载性能测试开始。当你完成编码时不要做它们,因为那时已经太晚了。

编辑:关注您选择语句的速度。用户在搜索时期望获得快速结果。