【问题标题】:Elegant database design help... (MySQL/PHP)优雅的数据库设计帮助... (MySQL/PHP)
【发布时间】:2010-10-12 15:57:17
【问题描述】:

我正在建立一个电影网站...我需要显示有关每部电影的信息,包括类型、演员和大量信息(类似于 IMDB.com)...

我创建了一个包含 ID 和一些基本信息的“电影”表。 对于流派,我创建了一个“流派”表,包括 2 列:ID 和流派。 然后我使用一个包含两列的“genres2movies”表:movieID 和genreID,来连接流派和电影表...

这样,例如,如果一部电影有 5 种不同的流派,我会在“genres2movies”表的 5 个不同行中获取电影 ID。它比每部电影每次都包含类型要好,但是...

有更好的方法吗???

我也需要为演员、语言和国家/地区执行此操作,因此性能和数据库大小非常重要。

谢谢!!!

【问题讨论】:

  • 只是想知道,作为 ALL 的一个问题(我是一个 mysql 新手),把所有的genres2movies 表全部删除不是更有效吗,因为在这个例子中不能你不只是在电影表中包含的流派列中用逗号分隔流派,然后在你的代码中解析和划分它们吗?

标签: php mysql database database-design


【解决方案1】:

你在正确的轨道上。这就是建立多对多关系的方式。数据库大小不会增长太多,因为您使用整数,并且为了速度,您必须为这些 ID 设置正确的索引。在进行 SELECT 查询时,请查看 EXPLAIN - 它有助于找到速度瓶颈。

【讨论】:

  • 我不是数据库专家.. 正确的索引是什么意思???对于“电影”数据库,我使用 ID 作为主键。对于“流派”,对于movies2genres,我将movieID 和genreID 都设置为主键。这是正确的吗??
【解决方案2】:

听起来您目前正在遵循正确的规范化规则,这正是您想要的。

但是,您可能会发现,如果性能是一个关键因素,您可能希望对数据的某些部分进行反规范化,因为表之间的 JOIN 是相对昂贵的操作。

这通常是适当/完全标准化和性能之间的权衡

【讨论】:

    【解决方案3】:

    您走在完全正确的轨道上 - 这是正确的、标准化的方法。

    我唯一要添加的是确保连接表 (genres2movies) 上的索引同时包含流派和电影 ID,并且通常值得(取决于使用的选择)在两个方向上定义索引 - 即。两个索引,有序的流派 ID、电影 ID 和电影 ID、流派 ID。这确保了针对流派或电影的任何范围选择都能够使用索引来检索它需要的所有数据,而不必诉诸全表扫描,甚至不必自己访问表行。

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2011-07-01
      相关资源
      最近更新 更多