如何为未知数量的'元数据'设计数据库
我想用数量可变的属性在数据库中存储某些项目。如何为未知数量的'元数据'设计数据库
例如:
一个项目可以有“URL”和“PDF”财产既别人不连接,而不是有“形象”和“位置”属性。
所以问题是一些项目可以有一些属性和其他很多。
你将如何设计这个数据库。如何使其可搜索和高性能?
模式将是什么样子?
谢谢!
你有什么名字 - Entity Attribute Value (EAV)。它是“一种数据模型,用于可用于描述事物(”实体“或”对象“)的属性数量(属性,参数)可能非常大的情况,但数量实际上适用于给定的实体是比较适中的。“
我不确定OP是否说它必须是EAV - 属性可能是可变的,但是取自一个大的(已知)集合,在这种情况下,特定属性组的专用表可能会更好。 – finnw 2009-01-14 20:50:21
从阅读说明,这听起来像我所需要的。但大多数时候,我不喜欢cs-theory对维基百科的解释(没有冒犯性)。它在实践中并没有帮助我,虽然它可能会非常有趣......无论如何... :-) – 2009-01-14 20:55:47
有时候,有一半的战斗是知道什么叫做什么。它有助于沟通,并指导进一步的搜索! – 2009-01-14 22:17:14
具有以下字段创建一个属性表:
ITEM_ID INT(或任何ID类型是在项目表) PROPERTY_NAME VARCHAR(500) PROPERTY_VALUE VARCHAR(500)
设置一个外国item_id和项目的id字段之间的关键,你就完成了。
这就是你如何在SQL中进行多对一的关系。
我设计这样的表格,在过去有以下字段:
- ID
- 型
- 亚型
- 值
然后,我将有另一将定义所使用的类型和子类型的表,并可能为该类型和子类型组合提供数据类型,以便您可以编强制执行它。
它不漂亮,除非必须,否则你不想这样做。但是当你这样做的时候,它是我找到的最好的方式。
更新:即使你留下子类型空白,我觉得它是一件好事,因为它经常会让你想对已经存在的东西进行子分类。您创建类型:地址的示例,现在您需要邮寄地址和帐单地址以及实际地址。
任何人都在意评论我为什么被低估?我的回答错了吗?我误解了这个问题吗? – 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
现在,当你想查询你可以简单地加入表和筛选但是你的愿望...
这听起来像是一个完美的文档数据库工作。
对于这种情况,我使用MS SQL 2005中的XML类型列... 您将拥有XML + SQL的所有优点。这是使用XPath表达式作为SQL语句的一部分。
这是MS SQL 2005的一个特性,我不确定哪个RDBMS支持这个。 我不确定什么影响是性能明智的。
实体属性值(EAV)模型非常灵活。语义Web及其查询语言sparql也基于EAV。但有些人不喜欢它,因为这种模式会有性能损失。
从对数据库执行一些高负载性能测试开始。当你完成编码时不要做它们,因为那时已经太晚了。
编辑:关注您选择语句的速度。用户在搜索时期望获得快速结果。
请考虑http://stackoverflow.com/questions/296563/how-to-make-up-for-lack-of-a-computer-science-degree#296902。 – 2009-01-19 20:57:41