【问题标题】:Best way to design a table in which a cell has mutiple references?设计一个单元格有多个引用的表格的最佳方法是什么?
【发布时间】:2011-11-05 13:00:56
【问题描述】:

我的问题是关于如何设计数据库。

我有一张表,称为帖子,有列:

ID, subject, keywords, (and a few other columns)

和另一个名为关键字的表:

kw_id, keyword.

现在,每个“帖子”都有几个关键字,有时关键字会因为没有意义或重复而被删除。

我的问题是:

  • posts 表中的 keywords 列可以是外键吗? (每一行会有多个关键字)

  • 如果不能,确保数据完整性的最佳方法是什么(特别是在删除关键字时)?

提前致谢

编辑:你能指出我应该阅读的有关数据库设计的书籍或文档吗?看来我缺乏有关数据库设计的关键知识。

【问题讨论】:

    标签: mysql sqlite database-design data-modeling


    【解决方案1】:

    您必须翻转依赖项:表 KEYWORD 应该引用回帖子。您可能希望在两者之间查找给定关键字的所有帖子(伪代码):

    POST
        POST_ID
        ...
    
    KEYWORD
        KEYWORD_ID
        NAME        /* the keyword */
    
    POSTKEYWORDREL    /* relationship */
        POST_ID     /* foreign key to POST */
        KEYWORD_ID  /* foreign key to KEYWORD */
    

    现在,您只需删除POSTKEYWORDREL 中的关系即可轻松从给定帖子中删除关键字。

    编辑:与往常一样,对于文档,让我指出您 Wikipedia。您还应该看看normalization(我认为这是数据库设计中最重要的概念)。

    【讨论】:

    • @Tivie:答案中添加了两个维基百科链接,您可以从那里更深入地研究问题。请记住,给定的“关键字”设计在现实中可能会变得更加复杂,例如在多语言支持方面。
    • 谢谢,这对我有很大帮助!
    【解决方案2】:

    您需要在“中间”有一个带有外键的多对多表

    帖子:

    ID (PK)
    Subject
    (and a few other columns)
    

    关键词:

    kw_id (PK)
    Keyword (UQ)
    

    帖子关键词

    PostID (PK, FK to Posts.ID)
    kw_id (PK, FK to Keywords.kw_id)
    

    为什么您的“ID”列有不同的约定?我个人会在整个过程中使用 PostID 和 KeywordID。

    编辑:database design link

    【讨论】:

    • 谢谢。实际上,在第一个表中它称为 p_id,我忘记了“p”。
    【解决方案3】:

    要遵循您的设计,请在帖子表中删除列关键字。

    然后创建另一个表来建立多对多关系,类似于

    发布关键字

    该表将至少包含 post_Id 和 kw_id,它们都是各自表的外键。

    就个人而言,在这些情况下,我还创建了一个不涉及多对多的本地 PK 列,例如 PostKeywords_ID,它只是该表本地的自动增量。

    【讨论】:

      【解决方案4】:

      您不需要在 post 表中放置 keyword 列,而是需要一个包含两列的单独表 post_keywordpost_idkeyword_id。此表中存在一行表示已为特定帖子分配了特定关键字。该表的主键是 (post_id, keyword_id)。两列都是其主表的外键。

      这是多对多关系的标准设计实践。

      如果您的 keyword 项要按特定顺序显示,请添加 order 列。

      顺便说一下,为了获得最佳效果,请将您的 post 表中的 id 列命名为 post_id 以及它出现的所有其他表。这样一来,各种模式工程工具将能够弄清楚您在做什么。

      【讨论】:

      • 我使用下划线只是因为我的一些东西在不区分大小写的 Oracle 中。如果您只在 mySql 中工作,@gbn 建议的列和表名称就可以了。
      • 谢谢。我将在 MySql 中为网站使用数据库,为 Android 应用程序使用 SQLite。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 2013-09-15
      • 2019-05-09
      • 1970-01-01
      • 2021-10-15
      • 2015-07-01
      相关资源
      最近更新 更多