【发布时间】:2012-07-24 14:49:18
【问题描述】:
大家好,
我一直在学习数据库和数据库设计,但我发现我仍然遇到一个我自己无法回答的问题。所以我向社区提出这个问题,希望有比我更多知识/经验的人来回答。
我的任务是开发一个数据库,该数据库跟踪整个船队的库存水平。
当前的设计为每艘船都有一个表格,其中列出了所有可能的部件(机械类型、部件号、制造商、序列号等)
这意味着一件机器或零件的细节可以被复制很多次(实际上有多少艘船就可以复制多少次)。
我一直在尝试根据自己学到的知识进行重新设计,我会提出如下设计方案:
[SHIP]
ID, Name, Class, Tonnage, Fleet, Superintendent etc.
[Machinery]
ID, Type, Make, Model etc. (Can have separate table for manufacturers and types if required)
[Part]
ID, Part number, Description, etc.
以上将是三个主要的表,现在开始变得困难。
每艘船可以有多个机械项目,每个机械项目可以出现在多艘船上(需要一个连接表)
每个机械项目可以有多个零件,每个零件可以属于多个机械项目(另一个连接表)
可能有成百上千个部分使连接表变得巨大。
此外,一旦您想跟踪库存,您就会查看另一个连接表
[Stock Level]
ShipID, PartID, Stock Level
另外,如果您想要最低库存(可以与 Stock Level 结合使用吗?)
[Min Stock]
ShipID, PartID, Min Stock
最后,如果您想要标准化数据库(即没有 Part No.1、Part No.2 或 Serial No.1、Serial No.2)
你需要多几张桌子
[Serial Numbers]
ShipID, MachineryID, Serial No
[Part Numbers]
PartID, Part Number
序列号可能是相当标准的,没有问题,但是 [零件号] 将需要至少与 [零件] 表中的记录一样多的记录。
地图(尽我所能在没有图片的情况下表示,为简单起见省略了路口)
<>V represent many
-| represent one
-----< Serial Numbers
| V
| |
Ship >---< Machinery >---< Parts ---< Part Numbers
V V
| |
------ Stock Level -------
现在真正的问题是,我是否在基本设计原则中遗漏了一些可以消除如此巨大的联结表的内容,或者这种数据库是否可以预期。
此外,在零件编号等情况下,规范化需要一个额外的表,其中至少有相同数量的记录,而不是原始表中的额外列,您以后会去规范化以提高查询速度吗?
任何关于外部资源(包括其他论坛、教程、书籍)的提示、技巧或指针将不胜感激。
欢迎所有答案,提前感谢您提供的任何帮助。
戴夫
【问题讨论】:
-
巨大的联结表是正常的。如果说巨大是指几百万行,那并不是很大,而且它们很容易被索引。
-
快速回答你们,这回答了我的一个问题。不过,我需要对索引进行一些研究。我认为索引是由 DBMS 自动完成的,但我会做一些调查,因为这可能对速度有很大帮助。
标签: database-design