【问题标题】:Design decision: Dynamically adding data question设计决策:动态添加数据问题
【发布时间】:2008-10-20 15:37:21
【问题描述】:

我需要让用户能够选择性地将元数据添加到文档中。另一种表述方式是,用户需要在文档中添加至少 5 个类别。

基本上,我想要做的是在临时基础上动态地将元数据(或类别)添加到文档中。以下是我想到的选项:

选项 1: 我应该通过在数据库中动态创建新表列来做到这一点吗?

选项 2: 我是否应该定义 5 个名为 attirbute1、attirbute2、attirbute3、attirbute4、attirbute5 的列,然后仅在用户需要属性时使用并显示它们。

选项 3: 我应该创建一个元数据表来跟踪列和与它们关联的数据吗?

您认为实现这一目标的最佳方法是什么?您能想到任何其他方法来轻松添加此功能吗?问题是功能需要非常通用。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    每个文档都有一个唯一的 DocumentID。

    只需添加另一个包含三列的表:

    文档ID
    元名称
    元数据

    然后他们可以将尽可能多的元数据添加到给定的文档中。如果他们所有的文档都使用相同的元名称,那么搜索元数据就很简单了。

    -亚当

    【讨论】:

    • 这是我将使用的路线。我们在工作中经常使用它。
    • 我将如何实现与文档关联的表\列的视图?有人可以举个例子吗?谢谢
    • 我在这里问过stackoverflow.com/questions/219559/… 并且有一些建议。当我在必须使用两个查询之前这样做时,第二个是由第一个的结果形成的(网上有 php/mysql 示例)
    【解决方案2】:

    这听起来很像标记。您可能可以修改acts-as-taggable 来做您需要的事情。

    【讨论】:

      【解决方案3】:

      您不清楚的一件事是属性的数量和/或名称是否可以更改,或者是否所有文档都相同。这会稍微改变我的建议。

      假设您有一个唯一描述给定文档的对象句柄,我建议使用一个表来管理元数据。如果您有未知数量的属性和这些属性的未知名称,我建议您这样做:

      create table DocMetaData
      (
         DocumentHandle        varchar NOT NULL,
         MetaDataName          varchar NOT NULL,
         MetaDataText          varchar NOT NULL
      );
      

      然后,当您拥有使用最合适名称的元数据时,您可以将其插入到此表中。如果没有行,就没有元数据。如果有元数据,您显然有该元数据的名称,以及数据本身。如果需要,您可以在元数据本身中包含可空性,尽管我可能只是将其设为空文本(例如,default ''),而不是空值,因为您会遇到奇怪的行为(不要让您的行!)如果您选择一列但它不存在并且您没有明确要求空值行。请记住,这种设计没有拼写出unique,所以你有选择权,只有当你有数据时才存储......

      当然,如果所有可能的元数据属性都已知,您可以将它们拼出来!

      动态表创建是一种皇家的痛苦 - 我不会在这里做。

      【讨论】:

        【解决方案4】:

        所有这些选项都是可行的,并且没有一个正确的答案。您应该权衡各种选择,并根据您的情况选择最佳解决方案。

        选项 1:可行,但随着用户数量的增加,可能真的会失控。也可能对存储成本产生影响。

        选项 2:可能是实施速度最快的解决方案,但最不可靠的解决方案和更高的维护成本。如果您需要转到 6 列,则必须添加另一列,等等。

        选项 3:可能最强大的解决方案是拥有一个捕获此信息的元数据表,然后基于此元数据动态构建表\列。此解决方案也可能耗时最长且成本最高。

        【讨论】:

          【解决方案5】:

          我当然会选择选项 3:有一个名为 DocumentCategories 的表,它存储每个文档所属的类别。它不仅“更具关联性”,而且在您的需求发生变化时也会有所帮助:如果您决定明天需要 6 个类别怎么办?

          此外,它还为您提供了更多查询选项:如果您想查看每个类别被使用了多少次,或者按类别选择文档怎么办?使用选项 3,这只是一个连接,它既快速又易于编写。选项 1 和 2 使做这样简单的事情变得非常复杂。

          【讨论】:

            【解决方案6】:

            我会选择选项 3。

            动态更改数据结构将变得非常难以维护,并且可能会引入一些有趣的错误。

            拥有许多可能需要也可能不需要的列仍然会增加复杂性,因为您需要检查是否使用了每一列。此外,您仍将被限制在 5 列。

            选项 3,虽然非常灵活,并且允许增长。只需要一个引用文档的外键、一个名称列和一个值列。

            【讨论】:

              【解决方案7】:

              我会选择三张桌子。

              文档(文档)

              类别(定义的类别)

              DocumentCategory(将文档连接到类别的链接表)

              唯一的缺点是您的 dbms 可能不支持将这种设计限制为每个 Document 至少需要五个 DocumentCategories 条目的好方法,但您可以在应用程序级别强制执行此操作。

              【讨论】:

                猜你喜欢
                • 2015-04-16
                • 1970-01-01
                • 1970-01-01
                • 2013-04-24
                • 2011-03-04
                • 2014-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多