我想在Documents表上创建一个组合键(这就是我的想法,但我愿意接受其他建议)。它将由两列组成,年份(2010,...)和一个ID,它将自动递增,但它应该每年重新启动。
所以像这些键2010-1,2010-2,...,2011-1,2011-2,...并且优选地,这些键还应该用于显示、打印和搜索。
虽然我不相信自动递增会起作用,因为每年都会重置,所以我想我必须自己递增,不是吗?
或者我应该创建一个varchar列,自己构造每个键,然后在该列上放置一个唯一的?
那么,我有什么选择呢?
请也考虑到未来的设计问题,我可能会有一个选择的设计,无论它是什么,易于查询。
更新:
我真的开始考虑让应用程序构造密钥并在插入时提供它。但是,这将需要在DB中查找最后发出的ID,这可能会导致大量使用时出现问题。
发布于 2010-08-05 06:24:54
将业务与数据存储结构分离是一种很好的做法。为什么?因为明天会有人决定改变业务逻辑:
那么你应该做什么呢?
所以,我的解决方案是:
使用主键(例如int或您首选的数据类型)来与数据库中的其他表建立关系,并使用您想要的业务键字段(可能是某个标识符generator)
的年份)来与数据库中的其他表建立关系
发布于 2010-08-05 05:57:20
虽然我不相信自动递增会起作用,因为每年都会重置,所以我想我必须自己递增,不是吗?
是啊。
我建议添加一个列,以便生成重置值。IDENTITY列将是最好的;DATETIME可以保存记录创建时间,但事务在3.33毫秒(0。00333秒)将具有相同的时间戳。
无论采用哪种方法,您都可以使用以下命令生成id
值:
SELECT (SELECT COUNT(*)
FROM DOCUMENTS t
WHERE t.year = d.year
AND t.col <= d.col) AS id,
d.year
FROM DOCUMENTS d
或者,如果您使用的是SQL Server 2005+,您可以使用:
SELECT ROW_NUMBER() OVER (PARTITION BY d.year ORDER BY d.col) AS id,
d.year
FROM DOCUMENTS d
发布于 2010-08-05 05:58:10
为什么不添加一个实际的自动递增id呢?组合键可以很快地增长到它们实际上无用的地方-特别是出于性能原因,如果您必须在表上进行连接。如果您还想记录Document XYZ是2010年存储的第一个文档,那么仍然可以保留Year
和Order
(或其他)列,但主键保持整洁。
https://stackoverflow.com/questions/3410153
复制相似问题