2008-11-18 47 views
3

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

回答

6

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

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

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

在评论一个行可能看起来像这样

1,'Student',347,'text' 
+0

+1为问题的经典解决方案。实际上,我已经看到Oracle设计的数据库使用类似的结构来处理数据库中的所有*解码表。在查询时可能会有些杂乱,但肯定会简化结构 – Cruachan 2008-11-18 10:19:22

+0

感谢您提供最高效的解决方案。我有这种想法使用varchar表名称,但我认为Enum是最好的。 – hash 2008-11-19 10:53:56

0

是学生或老师或工作人员不只是一个类型的人..

让你有一个人,一个人可以有很多意见?所以你有一个关于此人的personscomments表,为什么有话table..is此言不只是一个类型的注释..

其很难看到没有更深入的架构

2

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

1

如果你想保留外键约束,你需要一个表来处理每个将有子注释的表的映射。

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

然后,在映射表中,您将具有外键约束的comment_id和__id用于approriate表。

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来选择它们。

2

由于这是一个多对多的关系,你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 | 
+-----------+------------+---------+ 

(而这又应该提示你添加一个查找表为这些实体...但我们不要去那里)

0

我的50美分:Zoredache解决方案绝对是好的,但我不鼓励使用枚举;它们在mysql中不是很聪明:如果你指定一个未知的值,那么错误就用一个空字符串表示 - 即使指定了一些默认值。另外,如果你想修改或添加一个新类型,那么对于ALTER来说很长。无符号的tinyint应该足以满足您的大多数需求...

相关问题