在列中构建并显示复杂的复合主键

Tar*_*rks 1 sql sql-server

我需要构建一个由3个部分组成的主键.

  • 第一部分是3个字母长,必须是a后跟两个数字,例如"a00"
  • 第二部分是一个3位数的唯一标识符,包括LEADING ZEROES,例如"003"
  • 第三部分是日期的年份部分,例如"2008"

这些都用破折号分开,所以完整的键看起来像"a00-014-2008"

我的解决方案是保存三个单独的列,每个列都有未格式化的数据,然后添加聚簇主键约束并在需要在视图中显示时对其进行格式化.这是一个很好的方式吗?我认为可能有一种方法可以使用触发器使整个密钥更新,但我不知道如何.我如何连接并在视图中显示它?

虽然不是一个家庭作业问题,但这将有助于我学业.

cle*_*tus 5

我的问题是:这三个价值中的任何一个都有自己的含义吗?或者它们只是主键的组成部分?如果他们完全没有其他意义那么你最好只创建一个具有整个值的单个列.

现在"意义"可能难以取得资格.这可能意味着它是一个特定的客户代码或搜索到的东西,或者很多东西.

通常我会尝试避免使用复合键,因为它们使连接变得复杂,并且通常会使ORM(通常将这种实践视为正确或错误 - 视为"遗留")使您的生活变得困难.

如果这些字段确实有意义,那么可以说它们不应该是主键的一部分.我认为这种做法是错误的.我几乎总是使用自动编号列或序列作为主键值(称为"技术键"而不是语义键).

鉴于用户提供了部分内容并且需要以特定方式进行格式化,我假设密钥具有整体含义,无论是产品代码,患者代码,预订编号还是类似的东西.这是对的吗?

如果是这样,鉴于我和我几乎完全偏爱技术密钥(意见在这个问题上有所不同),我会考虑不把它作为主键.为此创建一个自动编号字段.只需将其作为具有varchar(12)或其他任何索引的唯一索引.