【问题标题】:Creating a global ID for every row in multiple tables for notifications为多个表中的每一行创建一个全局 ID 用于通知
【发布时间】:2017-02-20 02:19:15
【问题描述】:

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

我需要创建一个通知系统,

例如“史蒂夫支付发票 1234”、“鲍勃购买产品 XYZ”等。我要创建的是“通知类型”表:

通知类型:

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

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

通知事件:

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)而不是变量)。

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

【问题讨论】:

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

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


【解决方案1】:

在将在表中插入记录的所有表中创建触发器,例如 KeyMaster 具有一个列键,每当在任何表中插入记录时,该列键也将是主键。插入此表中的值将采用 _ 格式。例如,如果一条记录插入到用户表中,id 为 1,那么插入到 KeyMaster 表中的记录将是“user_1”。同样,如果在发票表中插入 id 为 1 的记录,则插入到 KeyMaster 表中的记录将为“invoice_1”。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 2020-10-29
    • 2021-05-19
    • 2020-10-09
    • 2015-04-06
    • 2021-11-20
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多