2017-10-17 59 views
1

我想为以下40年的名称生成唯一的ID。注意开始和结束日期。不是每个名字都有相同的开始和结束日期。如何根据SQL表中的下一个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 
+0

使用GUID或哈希函数,如果没有重复的条目 – SteelToe

+0

ID \t名称\t年\t开始日期\t结束日期舞蹈 2050年1月1日\t 12/31/2050 梦\t \t 2050 2049年7月1日2050年6月30日摩卡\t \t \t 2050 2049年7月1日2050年6月30日 \t \t Noway 2050 \t 2049年7月1日\t 2050年6月30日 \t帕帕2050 \t \t 2049年7月1日2050年6月30日6 老式\t \t \t 2050 2050年1月1日\t 12/31/2050 \t波2050 \t 7/1/2049 \t 6/30/2050 – MJ8

+0

你能详细说明一下吗? – MJ8

回答

3

要做到这一点,最简单的方法是有一个查找表,其中每行包含您想跟踪的项目之一。每当添加一行时,添加一个生成默认唯一代理键的列(SQL Server中的“身份”列,几乎所有的RDBMS都有类似的东西)。

如果该值仅为日期范围(例如2017年1月1日至2017年12月31日),则可以使用。如果您的唯一值基于日期范围和用户名(例如:MJ8 + 2017年1月1日+ 2017年12月31日),那么这可能是数据库模式中的一个中心表格,更值得一个代理键。

代理键也帮助管理,你有重复的情况下(比如,两个条目史密斯+ 2017年1月1日+ 2017年12月31日) - 一个可能是ID = 3,其它ID = 8710.

没有在您的“源数据”上设置唯一值的一个很好的参数是它是smart data。你的唯一身份证最终可能会是一个字符串(或者是一个非常大的数字),比如2017010120171231。尴尬,但它有效。危险在于,用户(或开发人员)可能会看到这一点并决定,而不是“追溯到源代码”(通过或许加入包含源数据的表的此密钥),他们只会解析字符串并将每一半都转换回原始日期。这通常不是一个好主意,因为它会减慢处理速度,难以读取(以及调试和维护)代码,并且如果引用的数据发生变化,可能会使事情变得非常困难。

2

如果您需要在指定日期范围内的唯一的ID,那么我建议你做到这一点 - 创建日期范围表中,分配给每个一个唯一的ID(?如主键),然后使用现有表中的外键引用日期范围表,而不是显式地将开始日期和结束日期放在那里。

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

相关问题