我是第一年的网络开发学生,我正在寻找有关MySQL数据库设计的一些建议,以便扩展我最近为作业创建的网站。
我目前正在开发的网站将作为模拟摄影设备的在线数据库。目前,它允许用户搜索或使用过滤器来查找数据库上的特定摄像头。每个摄像头在网站上都有自己的页面,显示信息和图片等,理想情况下我希望这些信息可以被注册用户编辑,比如维基。
当前数据库设计:
目前,相机数据的数据库设计如下所示:
- > Current database design .png
您可以在图表中看到我有一个'相机'表,其中包含所有具有基本信息的相机。然后,为了规范化和过滤的目的,我有所有不同的'相机类型'的附加表格以及我所有相机中的所有'相机品牌'数据库属于。
现在我想做的是扩展我的数据库,以便能够存储每个相机的镜头,闪光灯,快门速度等技术规格,但我意识到这些信息的相关性取决于< em>相机类型(例如小型相机有固定镜头,但单反相机有可变镜头支架),理想情况下我只想在相机页面上显示与其相机类型相关的信息。
- 数据库重新设计 -
我在想的是我可以将相机的信息存储在两张桌子上 - 保留现有的相机表格以及一般的相机数据(如名称和年份发布),还可以在我的数据库中为每种相机类型创建其他表格(SLR) ,TLR,紧凑,即时...)每个都会存储与该相机类型相关的技术规格,并使用'相机'表中的'camera_ID'作为用于在两个表之间链接摄像机数据的外键。
虽然我不确定这是否是最好的解决方案 - 也许将相机数据分布在两张桌子上太麻烦和过于复杂?我还想知道如果用户决定他们想要更改相机的类型,这是否会导致问题,因为那时相机记录必须移动到另一个表并且将现有数据合并到其中。 此外,如果某些相机类型具有相同的变量属性,我将在不同的相机类型表中复制列,我不确定它是否有效。
我能想到的另一种方法是维护现有的设计,只需在'相机'表中添加更多列,以获取可能适用的所有可能的技术规格,但是只是意味着它可能有点低效,因为会有许多列可能与每个摄像机无关并且会保持空白(尽管这可能不是一个大问题?)
很抱歉,如果要收集很多信息,但我有点难过!任何意见是极大的赞赏。在此先感谢:)
答案 0 :(得分:1)
您正在描述一种继承形式。遗憾的是,当前的关系数据库管理系统不直接支持继承,因此必须对其进行仿真 - 您提出的两个解决方案称为“每个表的表”和“每个(整个)层次表”。 1
如果您有大量的课程(或预计将来需要添加新课程),请选择以前的 2 ,否则您可以使用更晚的课程。
有关继承的更多信息(也就是类别,子类型,子类化,泛化层次结构等),请查看ERwin Methods Guide,“子类型关系”部分。另外,请查看this post。
1 还有第三种策略,其中每个子类都由一个表表示,但父类没有自己的表。
2 您可以保留在父表中的常用字段和约束(例如外键),因此不需要在子表中重复它们。