设计决策:动态添加数据问题
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 条目的好方法,但您可以在应用程序级别强制执行此操作。
【讨论】:
以上是关于设计决策:动态添加数据问题的主要内容,如果未能解决你的问题,请参考以下文章