设计决策:动态添加数据问题

Posted

技术标签:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

文档ID
元名称
元数据

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

-亚当

【讨论】:

这是我将使用的路线。我们在工作中经常使用它。 我将如何实现与文档关联的表\列的视图?有人可以举个例子吗?谢谢 我在这里问过***.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 条目的好方法,但您可以在应用程序级别强制执行此操作。

【讨论】:

以上是关于设计决策:动态添加数据问题的主要内容,如果未能解决你的问题,请参考以下文章

数据库动态添加字段

如何在FastReport报表中动态添加数据集

如何在FastReport报表中动态添加数据集

数据库动态字段 个人设计的思考

数据库动态字段 个人设计的思考

用户控件动态创建添加