【问题标题】:Database normalization and duplication数据库规范化和复制
【发布时间】:2013-12-11 01:52:43
【问题描述】:

我在书签和标签之间有多对多的关系:

  • 书签
    • 身份证
    • 用户ID
    • 标题
    • 网址
  • 标签
    • 身份证
    • 用户ID
    • 标题
    • 说明
  • 标签书签 (连接表)
    • 标签ID
    • 书签 ID

据我所知,这是规范化且有效的。

但是,多个用户可能保存相同的书签,这意味着书签表中的 URL 重复。这种重复是否属于规范化,应该避免吗?

更新:

系统是这样工作的:

  • 用户登录并创建书签/标签。

  • 书签应至少附加一个标签。例如:“http://google.com”可能属于标签“google”和“search-engine”。

  • 当书签被删除时,TagsBookmarks 中的关系也会被删除。标签不会被删除。

  • 如果标签没有书签,用户可以删除它。

  • 没有标签就不能存在书签。

  • 标签可以在没有书签的情况下存在。

【问题讨论】:

    标签: database database-design erd


    【解决方案1】:

    通常,表名和表列是单数的。

    我会将 UserID 移动到 TagBookmark。

    Bookmark
    --------
    BookmarkID
    BookmarkTitle
    BookmarkURL
    
    Tag
    ---
    TagID
    TagTitle
    TagDescription
    
    TagBookmark
    -----------
    UserID
    TagID
    BookMarkID
    

    TagBookmark 的主(集群)键将是所有 3 个 ID 字段连接。

    我不确定 TagTitle 和 BookmarkTitle 之间有什么区别,因此可能需要进一步规范化。

    【讨论】:

    • 感谢您的回答。如果书签可以存在而不应用到标签,并且标签可以存在而没有任何书签怎么办。比 UserId 应该在 Bookmark and Tag 表中对吗?
    • @Mr.nuub:不。这就是我首先将 UserID 从 Bookmark 和 Tag 表中提取出来的原因。也许我不明白表之间的关系。你能用英语写下这些关系并将它们作为问题的一部分发布吗?
    【解决方案2】:

    您应该从 Bookmarks 和 Tags 表中排除 UserId 并将其添加到您的联结表中,因为我从您的解释中了解到您的系统是以用户为中心的。像这样:

    • 用户
      • 身份证
      • 名字
      • ...
    • 书签
      • 身份证
      • 标题
      • 网址
    • 标签
      • 身份证
      • 标题
      • 说明
    • UsersTagsBookmarks (联结表)
      • 用户ID
      • 标签ID
      • 书签 ID

    甚至您需要两个联结表,但这取决于您的系统逻辑:

    • 标签书签 (连接表1,指定所有可能的标签/书签组合)
      • 身份证
      • 标签ID
      • 书签 ID
    • UsersTagsBookmarks (联结表 2)
      • 用户ID
      • 标签书签ID

    【讨论】:

      猜你喜欢
      • 2011-06-09
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2012-07-11
      • 2016-12-28
      • 2012-10-08
      相关资源
      最近更新 更多