我正在设计日志信息的数据模型。
日志信息可以包含可变元素,而且非常动态。
哪种类型的数据模型应该更好? 使用XMLType列或具有Name = Value对的子表?
我希望避免创建多个列,因为它们的列本质上是动态的,并且可以非常频繁地更改。
我知道EAV模型不适合查询,但据我所知,Oracle 11g提供了一个PIVOT函数,可以将行转换为列,那么它会如何影响性能呢?
加载的数据将用于下游ETL系统,偶尔也会被技术分析师查询
由于
...拉杰什 我打算创建2个表:
具有公共属性的父表,这些属性是每个日志事件的一部分,而子表将具有父表id(logId)并且将具有其他事务元素。
目前除标准元素外还有200个元素,任何日志事件都可以包含10个不同的元素。此数字也非常不稳定,可能会经常变化。每当有新元素时,不断更改表数据结构是没有意义的。
此外,数据的存储时间不会超过7天,并且不会使用(或偶尔)表格进行查询。将有一个下游ETL作业,它将提取数据并执行平面文件转换。
我并不担心数据类型,因为一切都是字符串数据。 你觉得这种方法有什么顾虑吗?
答案 0 :(得分:1)
我倾向于使用已知的列,“几乎总是存在”的内容,以及用于列的过于个性化的任何位的XML。只要存在某种类型的架构(可能但不一定是由数据库强制执行),ET可能会更容易处理ETL。
答案 1 :(得分:0)
即使使用Pivot语句,EAV模型(非常快)也会过于复杂而无法查询。子查询,嵌套查询和连接将难以编写和理解,并且性能较差。
除性能外,您无法保证数据存储正确(日期位于日期列,数字列中的数字等等)。这意味着您将所有内容存储在字符串中并将其转换回正确的数据类型,希望它第一次正确插入。阅读本文档了解各种副作用。 http://antognini.ch/papers/DatatypesWorstPractices_20080509.pdf
即使在日志记录的情况下,您仍需要跟踪大多数日志的一些常见参数,并且只有少数特定于某些日志的参数。为这些特殊字段创建具有NULLLable列的表是更好的方法。您始终可以索引最重要的字段,如果您希望仅查看/显示某些字段,则可以构建特定于特定类型日志的视图。