【问题标题】:How to design MySQL Database如何设计 MySQL 数据库
【发布时间】:2009-04-11 16:22:34
【问题描述】:

我有一个名为“movie2person”的表,其中包含 3 列:movieID、personID 和 role。我使用这个表来连接'movies'表和'persons'表......多对多关系..

我已选择movieID 和personID 作为主键... 问题是有时我需要为同一个movieID 多次输入同一个personID,但我不能这样做,因为只允许同一movieID 和personID 的一种组合...

我该怎么做??

谢谢..

【问题讨论】:

    标签: php mysql database database-design


    【解决方案1】:

    要么在主键中包含角色,要么向表中添加一个新的人工键并将这个新列用作主键,您不会在此表之外使用它。

    【讨论】:

    • 将包含大量信息(角色)的 3 列作为主键不会影响性能??
    • 如果角色是大列,请改用人工键。它只需要是一个自动递增的整数。然后,如果仍然需要唯一性,您可以在剩余列上定义约束。
    • role 是 VARCHAR 80,但我需要 movieID 和 personID 是主要的,所以我可以从另一个表中引用它们..
    • 即使它们不是主要的,您也可以随时引用它们,尽管没有索引会影响性能。我不知道 MySQL 如何将字符串作为主键处理,所以我不能告诉你哪种方式更好。您可以将角色放在另一个表中并存储对该表的引用而不是字符串吗?
    • 我可以将角色放在另一个表中,但我将使用很多表来做一个太简单的事情,所以我将使用 3 个主键。谢谢!!
    【解决方案2】:

    根据您制作的一些 cmets,我认为您需要更多的标准化。创建一个角色表并相应地调整您的查找表

    movie
    +----+------------+
    | id | title      |
    +----+------------+
    |  1 | Braveheart |
    +----+------------+
    
    person
    +----+------------+
    | id | name       |
    +----+------------+
    |  4 | Mel Gibson |
    +----+------------+
    
    role
    +----+------------+
    | id | title      |
    +----+------------+
    |  1 | Director   |
    |  2 | Actor      |
    +----+------------+
    
    movie2person
    +---------+----------+--------+
    | movieID | personID | roleID |
    +---------+----------+--------+
    |       1 |        4 |      1 |
    |       1 |        4 |      2 |
    +---------+----------+--------+
    

    通过此设置,您将在 movie2person 上拥有一个三列复合主键。

    【讨论】:

    • Role 不仅仅是角色的名称,而是演员在电影中扮演的角色。例如:Rusell Crowe 在 Gladiator 中的角色是 Maximus,因此不需要角色表,因为该字段永远是独一无二的
    【解决方案3】:

    主键的意思是“这是该行的唯一标识符”。

    如果您要插入许多具有相同值的行,那么这不是您的主键。

    如果您打算为行插入完全相同的重复项,那么您根本没有主键,您应该永远放弃它。

    但是,如果您计划向每个 (movieID, personID) 对插入不同的角色,那么您只需将角色添加到主键即可。

    【讨论】:

    • 将包含大量信息(角色)的 3 列作为主键不会影响性能??
    • 您在角色中存储了什么?它的数据类型是什么?
    【解决方案4】:

    男性所有三列作为主键。

    【讨论】:

      【解决方案5】:

      我建议对您的设计进行一些更改:

      1. 将表的名称从 Movie2Person 更改为 MoviePerson_xref。以这种格式命名并从表命名约定中排除数字通常是标准的。

      2. 这个表应该有自己的主键,称为movieperson_xrefID。

      3. 然后您可以保存电影 ID 和人物 ID 的所有组合。

      【讨论】:

        猜你喜欢
        • 2010-10-08
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 2014-01-12
        • 2018-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多