我是一名学生,从理论上学习数据库,而不是实践。
但现在我有机会在做这个小团队玩具项目时设计数据库。
这是关于表的描述:
- 剧院
该表包含有关剧院的信息。一个剧院可以举办很多场演出。
- 座位
该表包含有关座位的信息。
座位可以通过主键对来区分:(theater_no, Seat_no)
- 展示
该表包含有关演出的信息。
一个剧院可以举办很多场演出。但演出将只在一个剧院举行。
(所以剧院取决于演出。选择演出后我们可以自动选择合适的剧院。)
- 座位_演出_等级
该表包含每个座位的座位等级。这是“座位”和“演出”之间的映射表,因为同一座位对于不同的演出可以有不同的等级。
[这是一个例子:]
“演出 1”、“演出 2”在同一剧院举行,“剧院 1”和“剧院 1”拥有“座位 1”
那么,“座位 1”是“表演 1”的 A 级,“座位 1”是“表演 2”的 C 级。
- 用户
该表包含有关用户的信息。
- 评论
该表包含有关评论的信息。
- 座位评论
该表包含有关座位评论的信息。
- 显示评论
该表包含有关演出评论的信息。
服务逻辑:
用户登录App,主页面列表显示。
如果用户选择一个节目,则会列出剧院的座位(所选节目发生的位置)。
如果用户选择座位,则会显示有关座位的评论(但评论也取决于节目)。
“3”对我来说是一个主要问题,因为很难设计“评论”表,因为它不仅取决于表演,还取决于座位。
首先,我设计了带有 4 个主键的“reviews”表:(user_id、show_no、theatre_no、seat_no),没有“seat_review”表和“show_review”表。
但我觉得这样太乱了,所以我改变了上面的设计。
我仍然对这个设计感到困惑,我不确定这是否能保持数据完整性、处理速度等。
所以,我的主要问题是:
设计“审查”表有什么好主意吗?(对我来说似乎是(多对多)对多(?)。)
对于左边4个表('theater'、'seat'、'seat_show_grade'、'show')具有循环关系。这是数据库的糟糕设计吗?如果不好的话我该如何改变呢?
感谢您的帮助。
附:
过去使用映射表的想法。
(我说的是4个主键,没有'seat_review'和'show_review')
您显示的表
seat_review
不是多对多对多。reviews
它只是代表和之间的一种多对多关系seat
。看起来可能是这样,因为它具有三列,但它引用的表之一具有复合主键,因此引用该主键的外键也必须具有多个列。
reviews
和之间存在第二个多对多关系show
。reviews
这独立于和之间的第一个多对多关系seat
。尝试将独立的多对多关系组合成单个交集表违反了第四范式。不要这样做!它带来的麻烦多于它节省的麻烦。
我认为你指的是正确的 4 张桌子。至少,当我查看你的图表时,这四个表位于右侧。
它们不存在循环关系。
seat_show_grade
参考文献seat
和show
seat
参考theater
show
参考theater
没有
theater
对任何其他表的引用。因而没有循环。听着,我一直在一家为世界各地的电影院提供服务的公司工作,而你们的设计是错误的。
你应该有一个像这样的星型模式:
在星型模式的中心应该有一个名为Ticket或Transaction 的表,因为您的整个业务都围绕它旋转。不是座位或表演。
另外,您自愿创建循环:看看您的维度如何创建圆圈?这会导致各处阻塞和死锁。这是错误的方法:这些表不应该在它们之间链接,但它们应该直接链接到事实表(票证或交易)。