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

时间:2016-10-11 13:56:51

标签: sql-server tsql database-design schema social-networking

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

我需要创建的是通知系统,

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

NotificationTypes:

id  message
11  "{0} paid invoice {1]"
12  "{0} purchased product {1]" 
...

然后有两个相应的表来存储每个通知事件的信息,然后是该通知消息的值。例如,对于“Steve支付发票1234”:

NotificationEvent:

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

NotificationEventValues:

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列,只有一个'数据类型'每行具有值的列。

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

ASK:
是否有更好的方法在所有表格中实现我的“全局”标识符?或者更好的方法来处理通知系统以避免这个问题?

1 个答案:

答案 0 :(得分:0)

在将在表中插入记录的所有表中创建触发器,例如,KeyMaster具有一个列键,只要在任何表中插入记录,该键也将是初始键。此表中插入的值将采用_格式。例如,如果在id为1的用户表中插入记录,则插入KeyMaster表中的记录将为' user_1'。同样,如果在ID为1的发票表中插入记录,则在KeyMaster表中插入的记录将是' invoice_1'。

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

要获得相应的记录,您需要编写类似下面的查询:

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