如何处理具有多个父项的表

时间:2011-07-23 05:55:26

标签: mysql database data-modeling

我无法为我正在处理的特定数据库结构建模。简而言之,考虑以下因素:

  • 网页上可以有一个或多个主题
  • 一个主题包含一个或多个注释
  • 评论可能有一个或多个针对它的投诉
  • 投诉也可以作为一个整体提交给线程
  • 投诉也可以针对该页面提交

我无法弄清楚如何在数据库级别对此进行建模。前三个很容易:

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

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

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

但如果我想要一个投诉表,那么一个模型怎么样呢?我认为你不想这样做:

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

如果您添加了新的对象类型,例如图片,则必须在投诉中添加更多列。有没有更好的方法来做到这一点,或者是否达到最佳状态?

提前致谢, - 安东尼

3 个答案:

答案 0 :(得分:1)

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

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

  • 投诉
  • compliant_comment_link
  • complaint_thread_link
  • complaint_page_link

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

此方法的优点是您可以使用外键来维护数据完整性。缺点是,无论何时你需要投诉新的“东西”,你都需要一个新的链接表,但我想你无论如何都必须创建一个新的“东西”表。

答案 1 :(得分:0)

我头顶的一个解决方案是拥有一张桌子:

ObjectType

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

然后您的投诉表如下:

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

当然,这可以在以后查询投诉表和加入其他人时添加额外的工作,但这完全取决于您要查询的内容。

答案 2 :(得分:0)

另一种方法是让一个新的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)

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