如何根据 SQL table 中未来 40 年的开始日期和结束日期生成唯一 ID

How to generate unique id based on start date and end date for the next 40 years in SQL table

我想为以下姓名列表生成未来 40 年的唯一 ID。注意开始和结束日期。并非每个名称都有相同的开始和结束日期。

ID  Name    year    Start Date  End date 
1   Dance   2050    1/1/2050    12/31/2050
2   Dream   2050    7/1/2049    6/30/2050
3   Mocca   2050    7/1/2049    6/30/2050
4   Noway   2050    7/1/2049    6/30/2050
5   Papa    2050    7/1/2049    6/30/2050
6   Vintage 2050    1/1/2050    12/31/2050
7   Wave    2050    7/1/2049    6/30/2050

如果您需要给定日期范围的唯一 ID,那么我建议您这样做 - 为日期范围创建一个 table,为每个日期范围分配一个唯一 ID(例如主键?),然后然后在现有 table 中使用外键来引用日期范围 table 而不是明确地将开始和结束日期放在那里。

如果您确实需要这些日期,请使用连接两个 table 的视图。

执行此操作的最简单方法是查找 table,其中每一行包含您希望跟踪的项目之一。每当添加一行时,添加一个生成默认唯一代理键的列(一个“身份”列,在 SQL 服务器中,几乎所有 RDBMS 都有类似的东西)。

如果该值只是一个日期范围,例如 2017 年 1 月 1 日至 2017 年 12 月 31 日,则此方法有效。如果您的唯一值基于日期范围和用户名(例如:MJ8 + Jan 1, 2017 + 2017 年 12 月 31 日),好吧,这可能是您数据库模式中的中心 table,更值得使用代理键。

代理键还有助于管理重复的情况(例如,Smith + 2017 年 1 月 1 日 + 2017 年 12 月 31 日的两个条目)——一个 ID = 3,另一个 ID = 8710。

不基于“源数据”的唯一值的一个很好的论据是它是 smart data。您的唯一 ID 最终可能是一个字符串(或一个非常大的数字),例如 2017010120171231。这很尴尬,但它确实有效。危险在于,用户(或开发人员)可能会看到这一点并做出决定,而不是“将其追溯到源头”(可能通过将此键加入包含源数据的 table),他们只会解析字符串并将每一半转换回原始日期。这通常不是一个好主意,因为它会减慢处理速度,产生难以阅读(以及调试和维护)的代码,并且如果引用的数据发生变化会使事情变得非常困难。