我有一个表格列表,例如学生,老师,工作人员,部门。等等,每个表格都有特定的评论。现在表格中的一条记录可以有一条或多条评论,表明这是从任何表格到评论表格的一对多关系。我不知道最好的方法是将评论表与每个评论表联系起来。如果我将注释表中的外键放到这些表中的每一个表中,它将像40-50个字段一样取决于否。的表格。其次,如果我将这些表中的每个表中的外键添加到备注表中,就像重复第二个备注外键的整行一样?同样,如果我在每个表中仅使用一个字段作为注释,我实际上只将行存储在一个文本字段中。有关如何实现高效解决方案的任何建议?我如何将一张桌子与许多不同的桌子联系起来?
回答
让我们假设你的表(学生,教师,职员,部门)都有一个名为Id的int主键。
对于你的评论表,你可以创建一个表。
Id int
CommentType enum (student, teacher, staff, dept)
LinkId int
Comment
在评论一个行可能看起来像这样
1,'Student',347,'text'
是学生或老师或工作人员不只是一个类型的人..
让你有一个人,一个人可以有很多意见?所以你有一个关于此人的personscomments表,为什么有话table..is此言不只是一个类型的注释..
其很难看到没有更深入的架构
你可以使用中间的“多对多”表。每个基表(学生,教授等)都会有一个改变的自我存储一个外键给基表(例如student_id)和一个外键给调度表。实际上,您的表格数量增加了一倍,但不需要修改现有的表格,并且可以获得充分的灵活性。
如果你想保留外键约束,你需要一个表来处理每个将有子注释的表的映射。
含义,注释将有一个主键,对处理该映射的每个表有一个外键约束。
然后,在映射表中,您将具有外键约束的comment_id和__id用于approriate表。
您的意见表可以如下所示:
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来选择它们。
由于这是一个多对多的关系,你migth可能想看看使用关联表。
使用您的例子,它可能是这个样子:
你的表,可以有评论:
+----------+------------+
| 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 |
+-----------+------------+---------+
(而这又应该提示你添加一个查找表为这些实体...但我们不要去那里)
我的50美分:Zoredache解决方案绝对是好的,但我不鼓励使用枚举;它们在mysql中不是很聪明:如果你指定一个未知的值,那么错误就用一个空字符串表示 - 即使指定了一些默认值。另外,如果你想修改或添加一个新类型,那么对于ALTER来说很长。无符号的tinyint应该足以满足您的大多数需求...
- 1. 如何将桌子与其他桌子联系起来?
- 2. 多张桌子与同一张桌子有关系
- 3. 如何将一张桌子与另一张桌子关联起来作为将来的记录
- 4. 什么更好 - 许多小桌子或一张大桌子?
- 5. 一张大桌子或许多小桌子
- 6. 结合一张桌子的计数并且与另一张桌子不同
- 7. 从一张桌子与另一张桌子匹配的列
- 8. 我可以通过将一张大桌子分成许多小桌子来优化我的数据库吗?
- 9. 另一张桌子里面的桌子?
- 10. 将五张桌子连在一起
- 11. 如何与Laravel 5中的同一张桌子建立一对多的关系?
- 12. 许多对一张桌子,在laravel的关系
- 13. 我如何避免同一张桌子上的多个连接?
- 14. 如何通过邮编将一张桌子加入另一张桌子?
- 15. 如何多次使用一张桌子?
- 16. 在同一张桌子上的多对多关系
- 17. 在同一张桌子上的多对多关系
- 18. 有一张桌子
- 19. 一张桌子的相关领域到另一张桌子mysql
- 20. 并排显示一张桌子,一个iframe和一张桌子
- 21. 我有三张桌子。我想要一张桌子。重新设计我的表
- 22. 将两张桌子组合在一起,以便一张桌子上的所有行都与另一张桌子上的每一行相匹配
- 23. 与实体框架在同一张桌子上的关系
- 24. 找张桌子
- 25. 学说一张桌子到很多桌子和纪录
- 26. 多张桌子还是一个大桌子?
- 27. 桌子与第一张桌子顶部并排输入/搜索
- 28. 将一张桌子上的数据复制到另一张桌子
- 29. 在一张桌子上选择查询,并在同一张桌子上加入
- 30. 如何组织div看起来像一张桌子?
+1为问题的经典解决方案。实际上,我已经看到Oracle设计的数据库使用类似的结构来处理数据库中的所有*解码表。在查询时可能会有些杂乱,但肯定会简化结构 – Cruachan 2008-11-18 10:19:22
感谢您提供最高效的解决方案。我有这种想法使用varchar表名称,但我认为Enum是最好的。 – hash 2008-11-19 10:53:56