我正在构建员工数据库,emp_person表(名,国籍,性别,...。etcc信息)和emp_contract表(雇用,合同类型,工资...)。我想知道在哪里分配主键,这是最佳做法?分配Pk和FK
Q
分配Pk和FK
0
A
回答
1
在您的设计中,创建名为Emp_Id的代理键(AutoNumber)并将其定义为emp_person表的主键。将数据存储在emp_contract表中时使用相同的密钥。
在数值列上创建的主键是嵌套练习。如果没有可以唯一识别记录的列,那么我们在表中创建一个代理键。
我遵循几个原则:
- 主键应该是必要的小。因为数字类型以比 字符格式更紧凑的格式存储,所以首选数字类型 。这是因为大多数主键在另一个表中都是外键 以及在多个索引中使用。 您的密钥越小,索引越小,您将使用的高速缓存 中的页面越少。
- 主键不应该改变。更新一个主键应该是 总是不可能的。这是因为它最有可能在多个索引中使用 并用作外键。单个主键更新 可能会导致更改的连锁效应。
关于代理vs自然键我指的是上面的规则。如果自然键很小并且永远不会改变,它可以用作主键。如果自然键很大或可能改变,我使用代理键。如果没有主键,我仍然会生成一个代理键,因为经验表明,您将始终将表添加到您的模式,并希望您将pk放在适当的位置。
阿曼达,为您的评论
解决“我的问题是我已经有nvarchar的PK(SQL Server 2008中)的老员工表,我想创建其他两个表,但改变PK到数后它已经连接到许多与FK关系的表,我正打算从PK字符(序列号部分)中取一个子字符串,并将它作为新表中的PK ...但我有近12条记录重复具有相同的唯一序列号,我想更新主键并将更新级联到所有FK表...但是我得到了主键约束的iolation。请帮助我“
创建一个新表与旧的和新的PK值。在两列上放置唯一的约束,以确保您迄今尚未破坏任何内容。
禁用使用此密钥作为PK或FK的所有表的约束。
针对所有表运行更新以将旧值修改为新值。
启用PK,然后启用FK。
相关问题
- 1. SQL Server表PK和FK
- 2. EF和字符PK/FK
- 3. DB设计FK&PK
- 4. Django - 保存一个新的table1.PK和table2.PK和table2.FK
- 5. JPA @OneToMany与复合PK - PK/FK重叠
- 6. Oracle ID,PK和FK数据库模式
- 7. EF6 PK和FK约束命名约定
- 8. SQL Server PK和FK始终等于
- 9. 删除FK行为PK + Symfony2和Doctrine
- 10. 我应该分配给我的桌子的PK和FK是什么?
- 11. PK,FK约束设计
- 12. 与FK的EclipseLink复合PK
- 13. DB Fk/Pk密钥性能
- 14. 正确FK PK关系
- 15. 两个FK对一个PK
- 16. 跨行的fk pk关系
- 17. 加入关于不区分大小写的PK和FK与JPA
- 18. 将PK从不同表中匹配到SQL Server中的复合PK FK
- 19. int分配给Pk [长]
- 20. 分配PK到链接
- 21. Postgresql分区和FK
- 22. MySQL的FK错误1005 - 相同的PK为FK
- 23. 查询与FK = PK状态,但显示没有FK行太
- 24. 没有标量PK特性的EF PK FK映射
- 25. 用PK和FK创建数据库和表格
- 26. JPA - 使用复合PK的和FK的和定义关系
- 27. 更新FK从PK使用PHP,MySQL的
- 28. Postgres的FK引用复合PK
- 29. Hibernate的实体不PK,但有FK
- 30. 使用PK的FK在JPA /休眠
伟大的答案 - 我见过的应用程序,他们试图使用'应该'是独一无二的,如美国社会保险号/纳税人ID,作为主键,但当人们意识到他们写了错误的SSN或有人打错了,它必须改变。 – nvuono
在这种情况下,他们也有自动编号和时间戳字段,所以没有两个记录不能相同。 –
谢谢你4你的答案,我的问题是我已经有一个旧的员工表与nvarchar PK(SQL Server 2008),我想创建另外两个表,但改变后的PK号码,它已经连接到许多表与FK关系。我打算从PK字符(序列号部分)中取出一个子字符串,并将其作为新表中的PK ...。但我有几乎12个记录重复使用相同的唯一序列号,我想更新主键并将更新级联到所有FK表...但是我得到了主键约束的iolation。请帮我 – Amanda