自动完成/主键作为字符串 - PostgreSQL

时间:2014-12-12 22:03:31

标签: database postgresql

我设置的数据库不是太复杂但仍然具有多个多对多关系。让我先简单地使用三个表来解释数据库(还有更多,但只是为了简单起见):

数据库正在存储有关已完成项目的信息。一个属性是使用的软件。所以我有三个表(各自的列/键):

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'。

1 个答案:

答案 0 :(得分:1)

使用代理键有其优点和缺点,本维基百科文章对此进行了详细讨论:

http://en.wikipedia.org/wiki/Surrogate_key

借用他们的标题......

  

优点:

     
      
  • 不变性
  •   
  • 要求更改
  •   
  • 性能
  •   
  • 兼容性
  •   
  • 均匀
  •   
  • 验证
  •   
     

缺点:

     
      
  • 解除关联
  •   
  • 查询优化
  •   
  • 正常化
  •   
  • 业务流程建模
  •   
  • 无意泄露
  •   
  • 无意的假设
  •   

通常情况下,您会出于实际原因使用代理键 - 例如在需要更新软件名称时避免头痛。