2

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

例如:

一个项目可以有 'url' 和 'pdf' 属性,其他的都没有,而是有 'image' 和 'location' 属性。

所以问题是一些项目可以有一些属性,而另一些则很多。

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

架构会是什么样子?

谢谢!

4

9 回答 9

8

您所追求的有一个名称 -实体属性值 (EAV)。它是“一种数据模型,用于描述事物(“实体”或“对象”)的属性(属性、参数)的数量可能非常庞大,但实际上将适用于给定实体是相对适度的。”

于 2009-01-14T20:43:50.527 回答
2

如果您不一定与 SQL 相关联,那么三重存储就是专为这项任务而设计的。大多数都设计为使用SPARQL查询语言进行查询。

于 2009-01-14T21:36:28.690 回答
1

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

于 2009-01-14T20:58:16.503 回答
0

从您的对象(项目)开始并为项目创建一个表。您的商品可以有 1 个或多个属性,或者根本没有?因此,设置一个具有唯一 ID 的属性表。现在设置一个包含许多项目(有些可以重复)和许多属性(也可以重复)的表

物品

物品编号

商品描述 ...

属性

属性ID

属性描述...

物品属性

行ID

物品编号

属性ID

现在,当您想要查询时,您可以简单地加入表并过滤您想要的...

于 2009-01-14T20:40:29.597 回答
0

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

首先对数据库进行一些高负载性能测试。完成编码后不要这样做,因为那时为时已晚。

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

于 2009-01-17T09:26:49.747 回答
-1

我过去曾设计过这样的表格,其中包含以下字段:

  1. ID
  2. 类型
  3. 亚型
  4. 价值

然后我会有另一个表来定义使用的类型和子类型,并可能给出该类型和子类型组合的数据类型,以便您可以以编程方式强制执行它。

它不漂亮,除非你必须这样做,否则你不想这样做。但这是我发现的最好方法。

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

于 2009-01-14T20:39:11.427 回答
-1

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

这是 MS SQL 2005 的一个特性,我不确定还有哪些其他 RDBMS 支持这个。我不确定性能方面的含义是什么。

于 2009-01-14T21:49:04.887 回答
-2

创建一个包含以下字段的属性表:

item_id int(或项目表中的任何 ID 类型) property_name varchar(500) property_value varchar(500)

在 item_id 和 item 的 id 字段之间设置一个外键,就完成了。

这就是在 SQL 中建立多对一关系的方式。

于 2009-01-14T20:37:22.380 回答
-2

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

表现?不知道。

于 2009-01-14T20:39:28.447 回答