【问题标题】:How to design a database for unkown amount of 'meta'-data如何为未知数量的“元数据”设计数据库
【发布时间】:2009-02-17 06:12:07
【问题描述】:

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

例如:

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

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

你会如何设计这个数据库。如何使其可搜索和高效?

架构是什么样的?

谢谢!

【问题讨论】:

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


【解决方案1】:

你所追求的有一个名字 - Entity Attribute Value (EAV)。它是一种数据模型,用于在可用于描述事物(“实体”或“对象”)的属性(属性、参数)的数量可能非常庞大的情况下,但数量实际上适用于给定实体的情况相对温和。”

【讨论】:

  • 我不确定 OP 是否说它必须是 EAV - 属性可能是可变的,但取自大型(已知)集合,在这种情况下,特定属性组的专用表可能是更好。
  • 通过阅读描述,这听起来像是我需要的。但大多数时候我不喜欢维基百科上的 cs-theory 类(无冒犯)解释。它对我的实践没有帮助,虽然它可能很有趣......无论如何谢谢...... :-)
  • 尽管如此,有时,成功的一半是知道什么叫什么。它有助于沟通,并指导进一步的搜索!
【解决方案2】:

如果您不一定与 SQL 绑定,triple store 就是专为这项任务而设计的。大多数都设计为使用SPARQL 查询语言进行查询。

【讨论】:

    【解决方案3】:

    对于文档数据库来说,这听起来是一项完美的工作。

    【讨论】:

    • 我不明白为什么这个答案不是一个好的答案,我最近听说过 couchDB 和 MongoDB 数据库,它可以很好地解决我的问题... +1
    【解决方案4】:

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

    物品

    物品编号

    物品描述 ...

    属性

    属性ID

    属性描述 ...

    物品属性

    行ID

    物品编号

    属性ID

    现在,当您想要查询时,您可以简单地加入表并根据需要进行过滤...

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

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

        1. 身份证
        2. 类型
        3. 亚型
        4. 价值

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

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

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

        【讨论】:

        • 有人愿意评论我为什么被否决吗?我的回答错了吗?我误解了这个问题吗?
        【解决方案7】:

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

        这是 MS SQL 2005 的一个特性,我不确定还有哪些其他 RDBMS 支持这个。 我不确定这对性能有何影响。

        【讨论】:

        • 这可能是仍然使用数据库时性能最差的情况,更不用说最难查询的情况了。糟糕!
        【解决方案8】:

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

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

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

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

        【讨论】:

          【解决方案9】:

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

          表现出色?不知道。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-01
            • 2016-12-21
            • 1970-01-01
            • 1970-01-01
            • 2012-12-08
            • 1970-01-01
            • 2015-12-08
            • 2019-08-01
            相关资源
            最近更新 更多