数据库规范化和复制

时间:2013-12-09 17:56:15

标签: database database-design erd

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

  • 书签
    • 编号
    • 用户ID
    • 标题
    • 地址
  • 代码
    • 编号
    • 用户ID
    • 标题
    • 描述
  • TagsBookmarks (联结表)
    • TAGID
    • BookmarkId

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

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

更新

系统的工作原理如下:

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

  • 书签应附有至少一个标签。例如:“http://google.com”可能属于“Google”和“搜索引擎”标记。

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

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

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

  • 标签可以不带书签。

2 个答案:

答案 0 :(得分:0)

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

我会将UserID移动到TagBookmark。

Bookmark
--------
BookmarkID
BookmarkTitle
BookmarkURL

Tag
---
TagID
TagTitle
TagDescription

TagBookmark
-----------
UserID
TagID
BookMarkID

TagBookmark的主(聚类)键将连接所有3个ID字段。

我不确定TagTitle和BookmarkTitle之间有什么区别,所以可能会有一些进一步的规范化。

答案 1 :(得分:0)

您应该从书签和标签表中排除UserId并将其添加到联结表中,因为您的系统是以用户为中心的,正如我从您的解释中所理解的那样。像这样:

  • 用户
    • 编号
    • ...
  • 书签
    • 编号
    • 标题
    • 地址
  • 代码
    • 编号
    • 标题
    • 描述
  • UsersTagsBookmarks (联结表)
    • 用户ID
    • TAGID
    • BookmarkId

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

  • TagsBookmarks (联结表1,指定所有可能的代码/书签组合)
    • 编号
    • TAGID
    • BookmarkId
  • UsersTagsBookmarks (联结表2)
    • 用户ID
    • TagBookmarkId