如何将一个表与多个不同的表相关联?

时间:2008-11-18 10:01:55

标签: mysql database database-design

我有一份表格列表,即学生,老师,工作人员,部门。等等,每个表都有特定于它们的注释。现在,表中的一条记录可以有一条或多条注释,表明它是从任何表到注释表的一对多关系。我不知道将评论表与每个评论表联系起来的最佳方法是什么。如果我将注释表中的外键放到每个表中,它将取决于40-50个字段。的表格。其次,如果我将这些表中的每个外键添加到备注表中,它就像重复整行只是为了第二个备注外键?同样,如果我在每个表中只使用一个字段作为注释,我实际上只在一个文本字段中存储行。关于如何实现有效解决方案的任何建议?

7 个答案:

答案 0 :(得分:6)

让我们假设您的表(学生,教师,员工,部门)都有一个名为Id的int主键。

对于您的评论表,您可以创建一个表格。

Id int
CommentType enum (student, teacher, staff, dept)
LinkId int
Comment

评论中的一行可能如下所示

1,'Student',347,'text'

答案 1 :(得分:2)

您可以使用中间“多对多”表。每个基表(学生,教授等)都会有一个自我存储一个外键到基表(例如student_id)和一个外键到commments表。您几乎可以将表的数量增加一倍,但不需要修改现有表,并且您可以获得充分的灵活性。

答案 2 :(得分:2)

由于这是一个多对多关系,因此您可能希望查看使用关联表。

使用您的示例,它可能如下所示:

您的表格评论:

+----------+------------+
| student  | student_id |
+----------+------------+
| Steve    |         12 |
| Larry    |         57 |
| Sunshine |         88 |
+----------+------------+

+--------+---------+
| dept   | dept_id |
+--------+---------+
| Math   |       2 |
| P.E.   |       5 |
| Drama  |      12 |
+--------+---------+

然后你需要跟踪实际的评论:

+-----------------------+------------+
| comment               | comment_id |
+-----------------------+------------+
| I love Math!          |          3 |
| Larry is my hero...   |          5 |
| Sunshine <3 Me!       |          6 |
+-----------------------+------------+

现在,您需要在这些表之间建立关联,这是您的关联表发挥作用的地方。您现在将学生或部门的评论关联起来,如下所示:

+------------+------------+
| student_id | comment_id |
+------------+------------+
|         57 |          5 |
|         57 |          6 |
+------------+------------+

+---------+------------+
| dept_id | comment_id |
+---------+------------+
|       2 |          3 |
+---------+------------+

这既有效又优雅。试一试!

(并为了保存另一个问题)

如果你担心有这么多的关联表,你当然可以只使用一个关联表,但我会反对它,因为它不是很整洁,并且删除了一些你可以用第一个参考完整性检查的可能性溶液:

+-----------+------------+---------+
| entity_id | comment_id | entity  |
+-----------+------------+---------+
|        57 |          5 | student |
|        57 |          6 | student |
|         2 |          3 | dept    |
+-----------+------------+---------+

(反过来应该提示你为这些实体添加一个查找表......但是不要去那里)

答案 3 :(得分:1)

如果要保留外键约束,则需要有一个表来处理每个具有comment-childs的表的映射。

含义,Comment将有一个主键,对每个处理映射的表都有一个外键约束。

然后,在映射表中,你有一个带有外键约束的comment_id和???? _ id到approriate表。

答案 4 :(得分:1)

您的评论表可能如下所示:

CommentID (int) - Primary Key
TableName (varchar(250)) - Table the comment is related to
RecordID (int) - the ID of the record in the table referred to
Comment (text) - the actual comment

您当然可以添加时间戳之类的可选字段,这样您就可以按照输入的顺序选择评论。

现在您可以使用此表存储任何表的注释,您可以通过筛选表名和记录ID来选择它们。

答案 5 :(得分:0)

是学生,教师或工作人员,而不仅仅是一种人......

所以你有一个人,一个人可以有很多评论?所以你有一个与这个人有关系的personcomments表,为什么有一个备注表..这不仅仅是一种评论......

如果没有更深入的架构,很难看到

答案 6 :(得分:0)

我的50美分:Zoredache解决方案绝对是好的,但我不鼓励使用枚举;它们在mysql中不是很聪明:如果指定了未知值,则错误用空字符串表示 - 即使指定了某个默认值。此外,如果您想修改或添加新类型,则需要很长时间。 unsigned tinyint应该足以满足您的大部分需求......