Sql server 为多个表中的每一行创建全局ID以进行通知

Sql server 为多个表中的每一行创建全局ID以进行通知,sql-server,tsql,database-design,schema,social-networking,Sql Server,Tsql,Database Design,Schema,Social Networking,我正在为MS SQL Server 2016设计本质上是一个会计/零售应用程序。我有大约75种核心数据对象类型,每种类型都在各自的表中(用户、组织、发票、付款等) 我需要创建一个通知系统 例如“Steve支付的发票1234”、“Bob购买的产品XYZ”等。我将创建一个“通知类型”表: 通知类型: id message 11 "{0} paid invoice {1]" 12 "{0} purchased product {1]" ... 然后有两个对应的表存储每个通知事件的信息,然后是

我正在为MS SQL Server 2016设计本质上是一个会计/零售应用程序。我有大约75种核心数据对象类型,每种类型都在各自的表中(用户、组织、发票、付款等)

我需要创建一个通知系统

例如“Steve支付的发票1234”、“Bob购买的产品XYZ”等。我将创建一个“通知类型”表:

通知类型:

id  message
11  "{0} paid invoice {1]"
12  "{0} purchased product {1]" 
...
然后有两个对应的表存储每个通知事件的信息,然后是该通知消息的值。例如“Steve支付的1234发票”:

通知事件:

id  notificationType (FK)   occured
21  11                      2016-01-01 00:00:00
NotificationEventValue:

id  notificationEvent (FK)  XXXXX
31  21                      (FK reference to Steve in users table)
32  21                      (FK reference to invoice 1234 in invoices table)
现在,由于我无法为NotificationEventValues.XXXXX创建通用外键,因此我将有一个“dataObjects”表,其中包含所有75种数据类型的FK列,其中只有一个“data type”列每行具有一个值

这样,我数据库中数据对象的每个实例都有一个唯一的ID,我可以在通知字段中引用它——这意味着一个巨大的表,因为它基本上对其他75个表中的每一行都有一个唯一的ID。另一个缺点是,这意味着对于每个用户、发票、任何“数据对象”,我都在浪费大量的空间,因为将为其他74个空值列的ID引用保留空间(因为它们是固定大小的ID,而不是可变的)

询问:

是否有更好的方法在所有表中实现我的“全局”标识符?还是处理通知系统以避免此问题的更好方法?

在所有表中创建触发器,这些触发器将在表中插入一条记录,例如KeyMaster,它具有一个列键,每当在任何表中插入一条记录时,该列键也将是primry键。此表中插入的值的格式为x。例如,如果在id为1的用户表中插入一条记录,则在KeyMaster表中插入的记录将是“user_1”。类似地,如果在id为1的发票表中插入记录,则在KeyMaster表中插入的记录将为“发票_1”

在NotificationEventValues表中,您只需要三列id、notificationEvent和key(对KeyMaster表的FK引用)

要获取相应的记录,您需要编写类似以下内容的查询:

select *
from NotificationEventValues n
inner join users u on 'user_' + u.id = n.key

不要使用全局ID。我们在一个更大的项目中这样做了,希望我们没有。你用什么来绕过它呢?你不能仅仅改变一个大系统。但是您真的需要在整个数据库中的数字是唯一的吗?