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