规范表达“联合”或“变异记录”?

时间:2011-11-14 20:41:12

标签: oracle database-design plsql

假设我有一些数据需要在一个表中表示几种类型。例如,“事件”表可能包含这些用户事件的条目:(“登录”,“注销”,“创建”,“删除”)。当然,每个事件的相关信息会因事件类型而异。

目前“events”具有(event_num,event_type),以及每个事件类型的表,由event_type区分。

在Oracle中是否有规范的方式来表达这一点?在通用SQL?

1 个答案:

答案 0 :(得分:1)

关系纯粹主义者会说每​​个不同的事件都是它自己的实体。听起来你已经只关注了那个模型(每个类型都有一个表。)父events表在实践中确实增加了很少。你不能从具有不同模式的表中真正UNION行,并且“重载”外键几乎总是很麻烦。

最常见的是,我已经将这些“事件”表合并到一个“日志”表中。编译所有事件并在应用程序中出现变得更加容易。历史上,记录事件的不同属性表示为包含其他信息的自由文本字段,但我建议这对XML数据类型有很好的用途。

你最终会得到一个这样的事件表:

CREATE TABLE events 
(
    Event_num int,
    event_date datetime,
    user_id int,
    ... //other attributes common to all events
    event_data XMLTYPE
)

这允许您将所有数据合并到一个表中,同时仍允许不同事件的不同属性。这是关系数据库中XML的常见用例之一,是对存储事件日志数据的旧方法的改进。