2

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

我有一个子表attachment,这是许多主表的通用表:teacher、、studentclassRoom和其他)。主表数量超过 10 个,比如说 n 个表。

我的问题是,这是一个好习惯:

  1. 在数据库中只创建一个名为 'attachment' 的表并将其与其 master 关联。
    这将导致附件表中有 n 个外键(即: n-1 未使用的列),这也将导致模型中的 n-1 个属性,而无需在每次创建模型时都被初始化或使用。

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

有什么建议吗?

4

2 回答 2

1

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

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

于 2013-10-13T13:10:38.673 回答
1

您可以做的是只拥有一个包含以下字段的表:id、reference_id(您的父表之一)、reference_type(即reference_id 属于哪个表)、(附件表中的所有其他字段)。

然后,例如,如果您想获取特定父类型的附件,您可以对该类型运行 SELECT 查询过滤,例如 WHERE reference_type='classroom'。

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

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

您可能希望在 (reference_id, reference_type) 上有一个复合唯一键,这将确保您不会获得重复的附件(除非您希望给定类型的给定 ID 有多个附件,其中case 键不应该是唯一的)。

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

于 2013-10-13T13:01:56.150 回答