Php 如何设计MySQL数据库
我有一个名为“movie2person”的表,有3列:movieID、personID和role。我用这个表连接“电影”表和“人物”表。。。多对多关系 我选择了movieID和personID作为主键。。。 问题是,有时我需要为同一个电影ID多次输入同一个人ID,但我不能这样做,因为只允许同一个电影ID和个人ID的一个组合 我该怎么做Php 如何设计MySQL数据库,php,mysql,database,database-design,Php,Mysql,Database,Database Design,我有一个名为“movie2person”的表,有3列:movieID、personID和role。我用这个表连接“电影”表和“人物”表。。。多对多关系 我选择了movieID和personID作为主键。。。 问题是,有时我需要为同一个电影ID多次输入同一个人ID,但我不能这样做,因为只允许同一个电影ID和个人ID的一个组合 我该怎么做 谢谢。在主键中包含角色,或者向表中添加新的人工键,并将此新列用作主键,您不会在该表之外使用它。在主键中包含角色,或者向表中添加新的人工键,并将此新列用作主键,您不
谢谢。在主键中包含角色,或者向表中添加新的人工键,并将此新列用作主键,您不会在该表之外使用它。在主键中包含角色,或者向表中添加新的人工键,并将此新列用作主键,您不会在此表之外使用它。主键的意思是“这是此行的唯一标识符” 如果要插入许多具有相同值的行,那么这不是主键 如果您计划为行插入精确的重复项,那么您根本没有主键,应该永久删除它
但是,如果您计划向每个(movieID、personID)对插入不同的角色,则只需将角色添加到主键,就可以了。主键的意思是“这是此行的唯一标识符” 如果要插入许多具有相同值的行,那么这不是主键 如果您计划为行插入精确的重复项,那么您根本没有主键,应该永久删除它
但是,如果您计划为每对(movieID、personID)插入不同的角色,那么您只需将角色添加到主键,就可以了。将所有三列作为主键。将所有三列作为主键。我建议对您的设计进行一些更改:
我建议对您的设计进行一些更改:
根据你的一些评论,我认为你需要更多的规范化。创建角色表并相应地调整查找表
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,因此不需要角色表,因为该字段始终是唯一的