如果我使用1对多关系,是否需要主键?

时间:2014-03-04 11:01:05

标签: mysql sql database database-design primary-key

我有一张名为branch

的表格

看起来像。

+----------------+--------------+
|     branch_id  |  branch_name |
+----------------+--------------+
|         1      |  TestBranch1 |
|         2      |  TestBranch2 |
+----------------+--------------+

我已将branch_id设为主键。

现在我的问题与下一个名为item

的表有关

看起来像这样。

+----------------+-----------+---------------------------+
|     branch_id  |  item_id  |         item_name         |
+----------------+-----------+---------------------------+
|         1      |     1     |  Apple                    |
|         1      |     2     |  Ball                     |
|         2      |     1     |  Totally Difference Apple |
|         2      |     2     |  Apple Apple 2            |
+----------------+-----------+---------------------------+

我想知道是否需要为item表格创建主键?

更新 他们不共享相同的项目。很抱歉混淆..分支可以创建另一个分支中不存在的产品。它们就像是共享同一个数据库的两个商店。

更新 对不起,信息不完整。 这些表实际上来自两个本地数据库...... 我正在尝试创建一个可以独立存在的数据库,但在与另一个数据库混合时仍然没有问题。因此系统只会附加来自另一个分支的所有项目数据,而不会将它们混合起来。在为项目生成item_id时,分支机构不会考虑其他分支的unique_id。但是,所有数据库可以共享相同的branch表作为参考。

提前谢谢你们。

3 个答案:

答案 0 :(得分:3)

  

我想知道是否需要为项目表创建主键?

你总是 1 需要一个关键 2 ,无论该表是否涉及 3 关系。唯一的问题是 kind 的密钥?

在这种情况下,您可以选择以下选项:

  1. 仅使{item_id}成为一把钥匙。这使得关系"非识别"和item a" strong"实体...
    • 哪个产生更细的键(与第二个选项相比),因此任何可能引用它的子表都更细。
    • 任何ON UPDATE CASCADE操作都会在item级别被切断,而不会传播给子级。
    • 使用ORM可以更好地发挥作用。
  2. {branch_id, item_no}上创建一个复合 4 键。这使得关系"识别"和item a"弱"实体...
    • 这使item本身变得更苗条(少了一个索引)。
    • 这对clustering非常有用。
    • 在某些情况下可以帮助您避免加入(如果有子表,branch_id会传播给他们)。
    • 可能需要正确建模"diamond-shaped" dependencies
  3. 所以选择你的毒药;)

    当然,branch_id在两种情况下都是外键(但不是键)。

    与所有这些正交,如果item_name必须是每个分支唯一的(而不是整个表),那么您还需要{branch_id, item_name}上的复合键。


    1 逻辑角度来看,你总是需要一个键,否则你的表将是一个多重集,因此不是一个关系(这是一个集合)因此,您的数据库将不再是"关系"。从物理角度来看,可能存在违反此规则的一些特殊情况,但它们很少见。

    2 从逻辑角度来看,它的主要是否是immaterial,尽管如果DBMS对它有特殊意义可能很重要,例如InnoDB uses primary key as clustering key

    3 请区分"关系"和"关系"。

    4 Aka。 "化合物"

答案 1 :(得分:0)

根据您的示例数据,您使用的是 n到m 关系,而不是 1到m 。它应该是这样的

item table
----------
item_id  | item_name
    1    | Apple
    2    | Ball


branch_item table
-----------------
item_id  | branch_id
    1    | 1
    1    | 2
    2    | 1
    2    | 2

您的brach_item表格应包含branch_iditem_id的复合唯一键,以确保无法添加重复的条目。

答案 2 :(得分:0)

是的,你这样做。主键是允许多对一关系存在的原因。

此要求已由branch_id列提供。

示例中的一对多关系不需要item_id列。