1

我是 Web 开发一年级的学生,我正在寻找一些关于 MySQL 数据库设计的建议,以扩展我最近为作业创建的网站。

我目前正在开发的网站将用作模拟摄影设备的在线数据库。目前它允许用户搜索或使用过滤器来查找数据库中的特定摄像机。每个相机在网站上都有自己的页面,显示信息和图片等,理想情况下,我希望注册用户可以编辑这些信息,比如 wiki。

当前数据库设计:

目前,相机数据的数据库设计如下:

-->当前数据库设计.png

您可以在图表中看到我有一个“相机”表,其中包含所有带有基本信息的相机。然后,为了规范化和过滤目的,我为现有的所有不同“相机类型”以及我的数据库中的相机所属的所有“相机品牌”提供了附加表。

现在我想做的是扩展我的数据库,以便能够存储每台相机的技术规格,例如镜头、闪光灯、快门速度等,但我意识到其中一些信息的相关性取决于相机类型(例如例如紧凑型相机具有固定镜头,但 SLR 具有可变镜头安装座),理想情况下,我只想在相机页面上显示与其相机类型相关的信息。

-- 数据库重新设计 --

我当时的想法是,我可以将相机的信息存储在两个表中 - 将现有相机表与一般相机数据(如名称和发布年份)一起保存,但也可以在我的数据库中为每种相机类型(SLR、TLR、紧凑,即时...),每个都将存储与该相机类型相关的技术规格,并使用“相机”表中的“相机ID”作为外键来链接两个表之间的相机数据。

虽然我不确定这是否是最好的解决方案 - 也许将相机数据分布在两个表上太混乱和过于复杂?我还想知道如果用户决定他们想要更改相机的类型,这是否会在以后引起问题,因为该相机记录必须移动到另一个表并将其现有数据整合到其中。此外,如果某些相机类型具有相同的变量属性,我将在不同的相机类型表中复制列,我不确定这是否有效。

我能想到的唯一另一种方法是保持现有设计,并在“相机”表中添加更多列,以获取所有可能适用的技术规范,但这只是意味着它可能有点低效会有很多列可能与每台相机都不相关,并且会保持空白(尽管这可能不是一个大问题??)

对不起,如果有很多信息需要接受,但我有点难过!任何意见是极大的赞赏。提前致谢 :)

4

1 回答 1

1

您正在描述一种继承形式。不幸的是,当前的关系数据库管理系统不直接支持继承,因此必须对其进行模拟 - 您提出的两种解决方案称为“每个类的表”和“每个(整个)层次结构的表”。1

如果您有大量类(或预计将来需要添加新类),请选择前者2,否则您可以使用后者。

有关继承(又名类别、子类型化、子类化、泛化层次结构等)的更多信息,请查看ERwin 方法指南的“子类型关系”部分。另外,看看这篇文章


1还有第三种策略,每个子类都用一个表表示,但父类没有自己的表。

2常用的字段和约束(如外键)可以保留在父表中,因此不需要在子表中重复。

于 2013-09-20T20:51:08.413 回答