Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何设计MySQL数据库_Php_Mysql_Database_Database Design - Fatal编程技术网

Php 如何设计MySQL数据库

Php 如何设计MySQL数据库,php,mysql,database,database-design,Php,Mysql,Database,Database Design,我有一个名为“movie2person”的表,有3列:movieID、personID和role。我用这个表连接“电影”表和“人物”表。。。多对多关系 我选择了movieID和personID作为主键。。。 问题是,有时我需要为同一个电影ID多次输入同一个人ID,但我不能这样做,因为只允许同一个电影ID和个人ID的一个组合 我该怎么做 谢谢。在主键中包含角色,或者向表中添加新的人工键,并将此新列用作主键,您不会在该表之外使用它。在主键中包含角色,或者向表中添加新的人工键,并将此新列用作主键,您不

我有一个名为“movie2person”的表,有3列:movieID、personID和role。我用这个表连接“电影”表和“人物”表。。。多对多关系

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

我该怎么做


谢谢。

在主键中包含角色,或者向表中添加新的人工键,并将此新列用作主键,您不会在该表之外使用它。

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

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

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

如果您计划为行插入精确的重复项,那么您根本没有主键,应该永久删除它


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

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

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

如果您计划为行插入精确的重复项,那么您根本没有主键,应该永久删除它


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

将所有三列作为主键。

将所有三列作为主键。

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

  • 将表的名称从Movie2Person更改为MoviePerson\u xref。通常标准的做法是使用这种格式命名,并将数字从表命名约定中排除

  • 此表应该有自己的主键,称为movieperson\u xrefID

  • 然后可以保存电影ID和人物ID的所有组合


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

  • 将表的名称从Movie2Person更改为MoviePerson\u xref。通常标准的做法是使用这种格式命名,并将数字从表命名约定中排除

  • 此表应该有自己的主键,称为movieperson\u xrefID

  • 然后可以保存电影ID和人物ID的所有组合


  • 根据你的一些评论,我认为你需要更多的规范化。创建角色表并相应地调整查找表

    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上拥有一个三列复合主键。

    根据您的一些评论,我认为您需要更多的规范化。创建角色表并相应地调整查找表

    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上拥有一个三列复合主键。

    将三列中包含大量信息(角色)作为主键并不影响性能??您在角色中存储了什么?它的数据类型是什么?3列中包含大量信息(角色)作为主键并不影响性能??您在角色中存储了什么?它的数据类型是什么?3列中包含大量信息(角色)作为主键并不影响性能??如果角色是一个大列,则使用人工键。它只需要是一个自动递增的整数。然后,如果仍然需要唯一性,您可以在其余列上定义约束。角色是VARCHAR 80,但我需要movieID和personID为主,以便我可以从其他表中引用它们。您可以始终引用对象,即使它们不是主对象,但如果没有索引,则会影响性能。我不知道MySQL如何将字符串作为主键处理,所以我无法告诉您哪种方法更好。你能把角色放在另一个表中,并存储对该表的引用而不是字符串吗?我可以把角色放在另一个表中,但我将使用多个表来完成一件非常简单的事情,因此我将使用3个主键。。谢谢3列中包含大量信息(角色)作为主键并不影响性能??如果角色是一个大列,则使用人工键。它只需要是一个自动递增的整数。然后,如果仍然需要唯一性,您可以在其余列上定义约束。角色是VARCHAR 80,但我需要movieID和personID为主,以便我可以从其他表中引用它们。您可以始终引用对象,即使它们不是主对象,但如果没有索引,则会影响性能。我不知道MySQL如何将字符串作为主键处理,所以我无法告诉您哪种方法更好。你能把角色放在另一个表中,并存储对该表的引用而不是字符串吗?我可以把角色放在另一个表中,但我将使用多个表来完成一件非常简单的事情,因此我将使用3个主键。。谢谢角色不仅仅是角色的名称,而是演员在电影中扮演的人。。例如:Rusell Crowe在《角斗士》中扮演的角色是Maximus,因此不需要角色表,因为字段将始终为uniqueRole。角色不仅仅是角色的标题,而是演员在电影中扮演的角色。。例如:Rusell Crowe在《角斗士》中的角色是Maximus,因此不需要角色表,因为该字段始终是唯一的