mysql 这是一个好的3NF数据库设计吗?

am46iovg  于 2023-08-02  发布在  Mysql
关注(0)|答案(2)|浏览(102)

我试图通过在MySQL中创建一个电影院数据库来了解数据库是如何工作的。我创建了以下需求,并试图基于3 NF勾画出我的ER图。很多资源都说我应该使用关联表,所以我尝试了,但我不确定我是否正确理解了它们之间的关系。这是一个满足需求的好的数据库设计吗?关联是否正确?enter image description here
要求:
·一个人可以是一个雇员或一个客户。
·员工也可以是客户。
·员工可以在多个剧院工作。
·剧院有许多放映室(每个剧院的放映室数量不同)。
·屏幕室可以具有不同的座位布置/容量/配置。
示例如下:
表:Screen_Rooms

| room_id (PK)   | theater_id (PK, FK) | capacity | rows | seats |
|----------------|---------------------|----------|------|-------|    
|1               |0001                 |10        | 2    |5      | 
|2               |0001                 |15        |5     |3      | 
|1               |0002                 |10        |5     |2      |
|2               |0002                 |20        |4     |5      |  

Table: Seat
| theater_id (PK, FK)   | room_id (PK, FK) | seat_id (PK) | seat_row | seat_number |
|-----------------------|------------------|--------------|----------|-------------|    
|0001                   |1                 |A1            |A         |1     
|0001                   |1                 |A2            |A         |2 
|...                    |                  |              |          | 
|0001                   |2                 |E5            |E         |5

字符串
·屏幕室有放映时间。他们一次只能放映一部电影,但一天中可以放映多部电影(即上午8点放映蜘蛛侠,然后下午12点放映罗宾汉)。
·电影可以有很多放映时间。
·电影可以有很多类型。
·电影只能有一个导演,但可以有许多演员。·导演可以是演员。
·客户可以做很多销售。
·客户可以有许多付款的销售,但只能支付一种方式(即。现金或信用卡,两者不可兼得)。
·员工可以进行许多销售(即销售门票)。
·销售可以是许多票。
·有不同的门票类型(儿童,成人,老年人,军事)。
·每张票都被分配了一个电影座位,在房间里,在剧院里。

vs91vp4v

vs91vp4v1#

虽然我不会做一个完整的,我会尽量给予一些例子来规范化。你有的东西已经很接近了。你可能有很多剧院,从这个开始。

Theater
TheaterID (PK, ex integer, auto-increment)
TheaterName
Location, address, phone, etc

字符串
在每个剧院里,你都有许多屏幕。每个屏幕都是一个房间。但是如果有多个影院,您需要将每个屏幕与其特定的影院联系起来。例如:剧院A可能有5个屏幕,剧院B可能有11个,等等

Screen
ScreenID (PK, ex integer, auto-increment)
TheaterID (FK, link to which theater it is)
Capacity, Seats, Rows


根据你的座位表

Seat
SeatID (PK, integer, auto-increment)
ScreenID (FK, link to screen.  From Screen, you know the Theater)
SeatRow    (constraint on Seat Row + Number for uniqueness to prevent duplicates)
SeatNumber


因此,此时,只需一个座位ID,您就可以知道哪个屏幕正在放映以及哪个影院正在放映
现在来看看即将上映的电影

Movie
MovieID (PK, integer, auto-increment)
MovieName


现在你有你所有的屏幕和什么电影是可用的。现在你需要知道什么样的展览是可用的。

ShowTimes
ShowTimeID (PK, integer, auto-increment)
ScreenID (FK to screens, which also then gives you the specific theater)
MovieID (FK to Movie)
BeginTime
EndTime


现在让人们买票

Ticket
TicketID (PK, integer, auto-increment)
ShowTimeID (FK to ShowTimes, which gives you the screen, theater )
SeatID (FK to Seat which also gets you to screen, theater )
TicketType (for the age groups)


因此,正如您在这里看到的,每个表都有一个主键,这将您与其他所有内容联系起来。不处理表示主键的复合键(多列),而是处理简化连接的特定唯一ID。表的“ID”键的表上下文如上所述

Table    PK
Theater  TheaterID
Screen   ScreenID
Seat     SeatID
etc


因此,如果您在表中看到一个ID而不是用于此目的,则您知道它是外键,但它也指示它源自哪个表

Foreign Key        To Primary Table
Screen.TheaterID   Theater.TheaterID
Seat.ScreenID      Screen.ScreenID

7kqas0il

7kqas0il2#

您至少有3个“实体”表:人,剧院,放映室。它们在“列”中具有合适的属性。人与戏剧之间可能存在多对多的关系。ScreenRoom可能需要引用它所引用的Theater。
至于nNF,我不能说,那个符号是在我构建表很久之后发明的。

相关问题