【发布时间】: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