我有一张名为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
表作为参考。
提前谢谢你们。
答案 0 :(得分:3)
我想知道是否需要为项目表创建主键?
你总是 1 需要一个关键 2 ,无论该表是否涉及 3 关系。唯一的问题是 kind 的密钥?
在这种情况下,您可以选择以下选项:
{item_id}
成为一把钥匙。这使得关系"非识别"和item
a" strong"实体...
item
级别被切断,而不会传播给子级。{branch_id, item_no}
上创建一个复合 4 键。这使得关系"识别"和item
a"弱"实体...
item
本身变得更苗条(少了一个索引)。branch_id
会传播给他们)。所以选择你的毒药;)
当然,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_id
和item_id
的复合唯一键,以确保无法添加重复的条目。
答案 2 :(得分:0)
是的,你这样做。主键是允许多对一关系存在的原因。
此要求已由branch_id列提供。
示例中的一对多关系不需要item_id列。