电影数据库 - 演员/演员/标签的存储?

时间:2010-12-20 22:06:48

标签: mysql database schema

创建一个电影数据库,我不喜欢给每个演员/女演员以及每个标签自己的行,就好像总共有1000万个moives,每个都有至少20-30个人,我们将有200个 - 表中有3亿行。

对于每部电影可以无限制的标签,它变得更加复杂。那么如何最好地存储这3个项目?理想情况下,这些可以被建模为多对多,但仍然会有数亿行。有关存储这些的更好的建议吗?我正在使用MySQL。

我会将它全部转储到文本文件中,但我需要在电影之间链接演员并进行一些分析,并允许用户评价演员按标签等查找电影,因此需要使用数据库。

4 个答案:

答案 0 :(得分:2)

1000万部电影看起来非常雄心勃勃。 IMDb's current statistics表明他们的头衔不到180万,人数约为390万。

话虽如此,我认为创建一个标题表,一个演员表和一个联结表来解决两者之间的多对多关系没有问题。标签也是如此。

alt text

答案 1 :(得分:0)

你厌恶数百万行的原因是什么?感知性能问题?

它将在某处拥有数以亿计的关系。你必须捕捉演员和电影之间的映射,正如你所说,其中有2亿至3亿(虽然我不相信有1000万部电影存在?)

如果你真的想要,你可以(例如)将电影演员的ids打包成多列(或一列),但这样会使搜索变得不愉快。

答案 2 :(得分:0)

这听起来可能有点premature optimization。您可以将所有参与者非规范化为电影表格中的某种TEXT列,但您的效果+搜索会受到影响,并且会失去关系数据的所有好处。

建议保持规范化架构,正如您最初的想法:

Movie (ID)
Actor (ID)
Tag (ID) --horror, comedy, etc.

MovieActor (MovieID, ActorID)
MovieTag (MovieID, TagID)
  • 在关联实体上按照正常情况创建索引:MovieActorMovieTag
  • 在测试环境中加载一些虚拟数据。 1000万电影,1亿演员,100万个标签。根据需要为每个创建关联条目。
  • 基线和性能测试。
  • Horizontal partitioning (sharding)如果您的效果指标需要更高的效果。

无论电影数量多少,或数据是否为DNA序列:实施设计,测试,根据您的要求判断其性能(用户接受度,SLA等)

答案 3 :(得分:0)

1000万部电影,每部20到30名演员(尽管这个数字听起来比现实生活更高)总会带来2亿到3亿的联想。如果您将数据存储在关系数据库中,则每个关联自然会是将电影链接到actor的表中的一行。每一行都会很小(两列 - 电影PK和演员PK;可能是一个额外的代理键列);大部分数据将存储在电影和演员表中。

任何其他解决方案(在SQL数据库中)都会以不太理想的格式存储相同数量的数据。