【问题标题】:Normalizing database规范化数据库
【发布时间】:2012-06-21 06:11:02
【问题描述】:

我正在尝试构建一个小型 Web 应用程序。该应用程序将存储书签及其标签。

书签:www.javaworld.com
标签:java、编程

书签:www.jquery.com

标签:java,webapps

现在我的搜索条件是基于标签的。如果用户搜索 java,它应该给出他用 java 存储的所有书签。此处必须显示 www.javaworld.com 和 www.jquery.com。

我的数据库表是这样的

用户(UID、Uname、密码)

书签(BID、UID、bookmark_url、tag1、tag2、tag3、tag4、tag5)

或

书签(BID、UID、书签)

标签(TID、BID、标签名)

这里 BID 和 TID 是代理键。

考虑到我给出的场景,请提出解决此问题的更好方法..

【问题讨论】:

    标签: database normalization database-normalization normalize


    【解决方案1】:

    为什么不在 Stackoverflow 上做类似的事情呢?标签是“全局的”,不绑定到单个书签。 允许您定义标签而无需事先定义书签,从而提高了灵活性。在您的第一个解决方案中也限制为 5 个标签也不是一个好主意。

    像下面这样分离它们可以让您更好地运行聚合函数(制作标签云),并且您可以使用标签表在复选框/多选中更好地显示新书签的标签。如果他们已经绑定到另一个书签,那会感觉很尴尬。

    Table: User [UID, Uname, PW]
    
    Table: Bookmark [BID, UID, url]
    
    Table: Tag [TID, Tagname]
    
    Table: Bookmark_Tag [BID, TID]
    

    【讨论】:

    • 数百万用户可以使用相同的书签 URL - 我有第五个表,它将用户 ID 与书签 ID 配对,否则您可能会让每个用户都复制 www.ebay.com (这违反了规范化规则)
    【解决方案2】:

    您的第一个解决方案存在以下问题:
    - 您有固定数量的标签:用户如何为她的书签定义第 6 个标签?
    - 您可能有许多 NULL 值:如果书签的标签少于 5 个,则其他列将不包含任何值。在这种情况下,您可能会为未使用的列浪费内存。
    - 为了加快检索机制,您应该索引要执行搜索的列(在您的情况下为 tag1,...tag5):您应该索引所有 5 个标记列。

    出于这样的原因,我建议您选择第二种解决方案,在 Tags 表中的“Tagname”属性上定义一个索引。或者,作为替代方案,您可以包含一个标签表,您可以在其中定义每个标签。在这种情况下,您的标签表将使用标签的数字 id (int) 来引用标签表。

    【讨论】:

      猜你喜欢
      • 2012-10-08
      • 2013-01-18
      • 2016-07-23
      相关资源
      最近更新 更多