您可以创建三个单独的表:SpeedboatTests、CarTests和GokartTests。但是,许多列在每个表中都会是相同的(例如执行测试的人员的员工ID,碰撞方向(前面、侧面、后面)等)。然而,许多列将是不同的,因此您不希望仅将所有测试数据放在一个表中,因为对于速艇来说,将始终有很多列为空,对于汽车来说,将始终有很多列为空,而对于卡丁车来说,也将始终有很多列为空。
假设您还想存储一些与测试直接无关的信息(例如正在测试的物品的设计者的员工ID)。这些列似乎不适合放在“Tests”表中,特别是因为它们将重复出现在同一车辆上的所有测试中。
下面是一种可能的表格排列方式,以便您了解涉及的问题。
Speedboats id | 关于速艇但不是测试的列1 | 关于速艇但不是测试的列2这种结构的优点/缺点是什么?实现这样一个结构的首选方式是什么?
Cars id | 关于汽车但不是测试的列1 | 关于汽车但不是测试的列2
Gokarts id | 关于卡丁车但不是测试的列1 | 关于卡丁车但不是测试的列2
Tests id | 类型 | 类型中的ID | 所有测试相关的列1 | 所有测试相关的列2 (“类型中的ID”将引用下面三个表之一的ID列,具体取决于“类型”的值)
SpeedboatTests id | 速艇ID | 关于速艇测试的列1 | 关于速艇测试的列2
CarTests id | 汽车ID | 关于汽车测试的列1 | 关于汽车测试的列2
GokartTests id | 卡丁车ID | 关于卡丁车测试的列1 | 关于卡丁车测试的列2
这种结构的好处在于它可以避免数据冗余和数据不一致,并且对于每种类型的车辆,都只需要存储与其相关的测试数据。缺点是查询可能会变得更加复杂,并且如果您需要添加其他类型的车辆,则必须修改架构。
更好的解决方案是使用关系数据库中的"继承"或"子类化",即创建一个父表来存储通用数据,然后为每个特定类型的车辆创建一个子表。这样可以避免在每个子表中重复相同的列,并且添加其他类型的车辆时也不需要修改数据库结构。
如果还有一些适用于所有车辆的信息,您希望将其放在一个车辆表中,那么CarTests表会是这样的吗?
id | vehicle_id | ...
而Vehicles表则如下: id | type | id_in_type (其中id_in_type指向一个速艇、汽车或卡丁车的ID)
看起来这只是变得更加混乱了。应该如何设置这样的内容呢?