【问题标题】:Storing Movie show times in database在数据库中存储电影放映时间
【发布时间】:2013-08-11 20:21:01
【问题描述】:

该应用程序用于显示哪些电影院正在放映特定的电影及其放映时间

电影桌:

info about movie
+----------+----------------------+--------------+
| movie_id | movie_name           | release_date |
+----------+----------------------+--------------+
  M1            Movie A                 2013/4/4
  M2            Movie B                 2013/4/4
  M3            Movie C                 2013/4/4

电影桌:

info about cinema. One cinema can be showing multiple movies at a time

+-----------+---------------+-----------+
| cinema_id | cinema_name   | address   |
+-----------+---------------+-----------+
  C1           Cinema A       #address1
  C2           Cinema B       #address2

Current_movies 表:

Table storing which cinema showing which movies.(Many to many relationship).
+-----------+----------+
| cinema_id | movie_id |
+-----------+----------+
  C1           M1
  C1           M2
  C2           M1
  C2           M2
  C2           M3

问题

我不知道如何存储演出时间

放映时间是指电影的开始时间。例如:2:40、5:00、8:30 等。

我想过这样做。

+-----------+----------+---------------+---------------+-----------------+
| cinema_id | movie_id | show_time_one | show_time_two | show_time_three |
+-----------+----------+---------------+---------------+-----------------+

但觉得这不是正确的方法。

请提出建议。

另外请建议对当前三个表是否有一些优化。

更新

如果您认为该问题不合适,欢迎您投反对票。 但也请花一点时间来评论这个问题出了什么问题,以及我该如何改进它以使其易于回答。

【问题讨论】:

  • 请解释一下show_time 是什么:媒体长度?电影预定放映的日期和时间?展示了多少次?
  • 感谢您的回复。放映时间是电影的开始时间,格式为 2:00 或 5:00 或 8:00 等。希望解释一下。
  • 您是否分别记录每个不同的显示?也就是说,您是否显示 8 月 12 日星期一晚上 7 点、8 月 13 日星期二晚上 7 点、8 月 14 日星期三晚上 7 点?还是您录制“晚上 7 点”并假设它每天都在那个时候播放?还是有什么不同?
  • @OllieJones 感谢您提醒我我错过的这方面。现在我想假设每天晚上 7 点。

标签: mysql database-design database-normalization


【解决方案1】:

您需要一个放映时间表:

  cinema_id | movie_id | showtime

所有这三个列一起构成了该表的主键。 showtime 列可以是 TIME 数据类型

您可能在该表中有这样的行:

  cinema_id | movie_id | showtime
  C1          M1         14:30
  C1          M1         17:00
  C1          M1         20:30

您可以使用 TIME_FORMAT 函数将您存储的时间转换为上午/下午等。http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_time-format

这里的设计原则叫做规范化,你应该阅读一下。

【讨论】:

  • 这样表格将充满冗余
  • 谢谢@Ollie Jones。有一个三列的放映时间表似乎是个好主意。唯一的疑问是我在这里重复 C1 和 M1 三次或可能是四次。所以我也会等待其他答案,希望有更好的解决方案。
  • 您无法避免在放映时间表中重复cinema_id 或movie_id,这是多对多的关系
  • 美国大约有 40,000 个商业影院银幕。假设每个屏幕上显示 3 次,这意味着表中有 120,000 行。让我们慷慨一点,每行给出 100 个字节。这意味着您的表将包含 12 兆字节的数据。如果你对它进行非规范化以节省空间,你可以把它降低到一半,这样你就节省了 6 兆字节。亚马逊网络服务上的磁盘空间成本约为每年每 GB 120.00 美元。因此,对该表进行非规范化以节省空间将为您每年节省 0.72 美元。而且,只要电影院一天放映四场电影,你就会被淹没。
  • 您能再澄清一个疑问吗?如果电影仍在至少一个电影院放映,如何存储?在 current_movies 表中添加一列movie_status 会是个好主意吗?
【解决方案2】:

把它变成这样:

cinema_id |  movie_id

然后是另一个表“showTime”:

movie_id | show_1 | show2 | show3

这样它的冗余性和规范化程度较低

【讨论】:

  • Cinema_id 无法删除,因为movie_id 和cinema_id 的不同组合的放映时间可能不同。
  • 为什么?当你使用表cinema_id | movie_id 然后你在没有cinema_id 的情况下制作表格,这是完美的解决方案
  • -1。具有相同类型数据的重复列是非规范化的,而不是规范化的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
相关资源
最近更新 更多