我正在为学校项目-机票数据库设计分贝。(使用 MySQL 工作台)
到目前为止,我想出了以下设计:
以下是我无法弄清楚的几件事:
- 将外键作为非整数值(例如
Varchar
)是个好主意吗? - 数据库需要以某种方式跟踪特定航班的预订座位数和机上乘客人数。不知道在哪里放置这些属性。
- 如何确保
Flight
特定航班的到达城市和出发城市(来自表格)不同?
我正在为学校项目-机票数据库设计分贝。(使用 MySQL 工作台)
到目前为止,我想出了以下设计:
以下是我无法弄清楚的几件事:
Varchar
)是个好主意吗? Flight
特定航班的到达城市和出发城市(来自表格)不同?
你得到你在 SO 上付出的代价。反对使用自然键(在这种情况下是名称而不是数字)的建议很常见,但被误导了。如果你不相信我,问你的教授。
座位数似乎是飞机的属性,对吧?预订座位数似乎是按航班号分组的预订座位数。
到达和离开城市可以用一个约束来
CHECK
约束。您可能还想确保在到达之前起飞(假设是 21 世纪的机场)。你的设计非常好,比你得到的一些建议要好。坚持下去,不要担心你的键的数据类型,不要寻找像触发器这样的幻想来实现应用程序逻辑(并且不要放弃对应用程序的真正约束)。
CREATE TABLE
多做几次RTFM 。如果您想到一个无法声明的约束,我建议您在项目中将其记录为 DBMS 中的缺陷。一定要仔细考虑什么是独特的。我怀疑您是否需要 BookingID,因为 PassengerID、Flight# 和 Seat 似乎是唯一的。乘客很复杂(在真实的数据库中,您将有一堆表格来描述某人),因此他们需要一个 ID 以方便参考,但您仍然可能不希望两条记录共享姓名和地址。
1-喜欢
int
。首先,最好使用长度较短的密钥。稍后,如果您更新航班状态,则可以。2-您可以
TotalSeats
在Airplane
表格中,或者写一个SQL
查询,通过检查Status
,您可以找出预订的座位和船上的乘客。(考虑@galuano13 建议的架构改进 - 您可以编写一个触发器来确保它们不相同,或者在代码中验证它。
1) 保持PK栏目为
int
,没有商业意义,也有一个独特的有商业意义的栏目。这意味着 FK 也应该如此int
。例子:2)您已经拥有
Flight
,Booking
和Booking Status
具有足够信息的表来派生number of bookings
和passengers
,因此无需将它们存储为单独的列。3)为了保持到达/离开数据一致,我将创建一个
Route
仅包含该数据的表并链接到该Flight
表;然后在表上创建一个插入/更新触发器,Route
以确保到达/出发城市不同。