公共子表到数据库中的许多主表

时间:2013-10-13 12:56:24

标签: php mysql database oop database-design

我正在使用php的mysql数据库来构建一个Web应用程序。

我有一个子表attachment,它是许多主表的公用表:teacherstudentclassRoom(以及其他)。 主表数量超过10,比如n表。

我的问题是,这是一个很好的做法:

  1. 在数据库中只创建一个名为“attachment”的表,并将其与其主人联系起来 这将导致附件表中的n个外键(即:n-1个未使用的列)也将导致模型中的n-1个属性,而不是在每次创建模型时进行初始化或使用。

  2. 为每个名为(master_i_Attachment)的主表(master_i)创建一个表,并将其与其主表关联。但是这会在我的代码中导致n个附件表和n个附件模型。

  3. 有什么建议吗?

2 个答案:

答案 0 :(得分:1)

你可以做的是只有一个包含以下字段的表:id,reference_id(你的一个父表),reference_type(即reference_id所属的表),(附件表中的所有其他字段)

然后,例如,如果要获取特定父类型的附件,可以对该类型运行SELECT查询过滤,例如,在哪里reference_type ='教室'。

或者,如果您想获得具有特定ID的教室附件:

SELECT * FROM attachment WHERE reference_id=<ID> AND reference_type = 'classroom';

您可能希望在(reference_id,reference_type)上有一个复合唯一键,这将确保您不会获得重复的附件(除非您希望给定类型的给定ID具有多个附件的可能性) ,在这种情况下,密钥不应该是唯一的。)

此解决方案是否适合您的需求取决于您将如何使用数据,即您最常运行的查询类型。

答案 1 :(得分:1)

基于database normalization concept,不鼓励在数据库中使用冗余和未初始化(或空)值。实际上,规范化试图越来越多地隔离数据(这意味着任何异常都会有更多的表)。 但是您可以简单地忽略规则或对数据库进行非规范化以解决性能问题。

在您的情况下,我认为最简单(和规范化)的方式是选择号#2(每种附件类型的单独表)。但是你可以像Ashalynd所说的那样调整你的设计。在表中放置一个type列以指定父表。使用此方法的BTW将增加数据库中级联更改的复杂性。