我设置的数据库不是太复杂但仍然具有多个多对多关系。让我先简单地使用三个表来解释数据库(还有更多,但只是为了简单起见):
数据库正在存储有关已完成项目的信息。一个属性是使用的软件。所以我有三个表(各自的列/键):
tblProjects(ProjectID [PK],ProjectTitle等...)
tblProjectsSoftware(SoftwareID [FK],ProjectID [FK],UniqueID [PK])
tblSoftwareUsed(SoftwareID [PK],SoftwareName)
为了使phppgadmin中的数据输入更容易,我正在考虑将'SoftwareName'作为tblSoftwareUsed中的主键。这是因为当我将与某些项目相关的软件输入tblProjectsSoftware时,我只能使用SoftwareID列上的自动完成功能,这个功能或多或少是一个无意义的数字。
正如您所看到的,当将数据输入tblSoftwareUsed的SoftwareID列时,我只能通过ID而不是名称“过滤”结果。当这个数据库变大时,它可能不是软件的问题,但是还有一些其他属性会有大量的记录。为了进一步解释,我将通过在tblProjects中为项目创建记录来启动数据输入。然后我会为使用的软件创建新记录(如有必要)。然后,当将数据输入到tblProjectsSoftware时,我要么必须知道该软件的ID,要么点击几页来查找它。
所以,我的问题是,通过将软件的名称作为主键,我是否会遇到任何问题,或者将它作为PK保留原样更好?此外,也许我错过了一个选项,可以搜索除了ID之外的'SoftwareName'。
答案 0 :(得分:1)
使用代理键有其优点和缺点,本维基百科文章对此进行了详细讨论:
http://en.wikipedia.org/wiki/Surrogate_key
借用他们的标题......
优点:
- 不变性
- 要求更改
- 性能
- 兼容性
- 均匀
- 验证
缺点:
- 解除关联
- 查询优化
- 正常化
- 业务流程建模
- 无意泄露
- 无意的假设
通常情况下,您会出于实际原因使用代理键 - 例如在需要更新软件名称时避免头痛。