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