【问题标题】:How to handle tables with multiple parents如何处理有多个父母的桌子
【发布时间】:2011-07-23 16:07:55
【问题描述】:

我在为正在处理的特定数据库结构建模时遇到问题。简而言之,考虑以下几点:

  • 网页上可以有一个或多个线程
  • 一个线程由一个或多个 cmets 组成
  • 评论可以提出一项或多项投诉
  • 也可以针对整个线程提出投诉
  • 也可以针对页面提出投诉

我不太清楚如何在数据库级别对此进行建模。前三个很简单:

webpage
----------
id
name

thread
---------
id
page_id
name

comment
--------
id
thread_id
name

但是,如果我想要一个单一的投诉表,那么如何建模呢?我认为你不想这样做:

complaint
----------
id
page_id
thread_id
comment_id

如果您曾经添加过新的对象类型,例如图片,则必须在投诉中添加更多列。有没有更好的方法来做到这一点,或者尽可能好?

提前致谢, - 安东尼

【问题讨论】:

    标签: mysql database data-modeling


    【解决方案1】:

    我会将投诉本身创建为一个实体,然后在它可以关联的所有不同事物之间建立链接表。

    所以,我有以下表格...

    • 投诉
    • compliant_comment_link
    • complaint_thread_link
    • complaint_page_link

    这与 Waleed 的解决方案略有不同。与所有类似的事情一样,有很多方法可以解决它:)

    这种方法的优点是您可以使用外键来维护数据完整性。缺点是每当您需要对新的“事物”进行投诉时,您都需要一个新的链接表,但我想您无论如何都必须创建一个新的“事物”表。

    【讨论】:

    • 我认为这可以做到。我希望避免为每种类型的关系使用不同的表,但这比我为每种关系使用不同的列并在整个地方都有空列的想法要好。感谢您的反馈!
    【解决方案2】:

    我想到的一个解决方案是有一张桌子:

    ObjectType
    
    -------------------
    |  id  |   name   |
    -------------------
    |   1  | Webpage  |
    |   2  | Thread   |
    |   3  | Comment  |
    -------------------
    

    那么你的投诉表可以如下:

    ----------------------------------------
    |  id  |   object_type_id   | objectid |
    ----------------------------------------
    |   1  |         1          |    1     |
    |   2  |         1          |    2     |
    |   3  |         2          |    1     |
    ---------------------------------------|
    

    当然,这可能会在以后查询投诉表并加入其他表时增加额外的工作,但这一切都取决于您要查询的内容。

    【讨论】:

      【解决方案3】:

      另一种方法是创建一个新的entity 表,该表与 3 个表(网页、线程、评论)具有超类型/子类型关系:

      entity
      ----------
      id (PK)
      
      webpage
      ----------
      id (PK)
      name
      FOREIGN KEY id REFERENCES entity(id)
      
      thread
      ---------
      id (PK)
      page_id
      name
      FOREIGN KEY id REFERENCES entity(id)
      
      comment
      --------
      id (PK)
      thread_id
      name
      FOREIGN KEY id REFERENCES entity(id)
      
      complaint
      ----------
      id (PK)
      entity_id 
      FOREIGN KEY entity_id REFERENCES entity(id)
      

      这样,创建一个新网页(或线程或评论)或删除一个网页会稍微复杂一些(在两个表中插入或删除一个新行而不是一个。)

      【讨论】:

      • 奇怪的是,我玩弄了这个想法。我认为令人讨厌的事情是创建实体。实体将对象联系在一起,但管理和维护起来很棘手。不过,感谢您的反馈!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 2022-12-16
      • 2011-02-12
      • 2014-07-01
      • 1970-01-01
      相关资源
      最近更新 更多