元数据结构在一个?数据库

时间:2011-10-20 05:53:48

标签: database parsing logging metadata

我希望以可查询的格式存储数据,而不必提前知道给定数据包将包含哪些字段。

简单/愚蠢的方法似乎就像一个大的键值对表,其中一个键返回到数据所描述的“父”对象表。

数据将具有以下属性:

  1. 许多“元数据”将与单个父对象相关联
  2. 数据将始终采用键值对形式
  3. 数据不是heirachical(仅限一级键值对)
  4. 会有很多。从未清除过。如果需要,移至副本存档存储
  5. 例如

    解析日志文件,并根据以下某些规则将消息拉入某种定义的格式:

    • 日志/系统名称
    • 地点
      • 日期
      • 时间
      • 等级
      • 消息

    可能会为许多不同的系统解析许多日志。每个系统可能有不同的字段。

    日期/时间/级别/消息字段仅在创建解析文件的规则时才知道,而不是在构建数据存储时。

    你会怎么做?你会使用什么样的数据库/设计?

1 个答案:

答案 0 :(得分:0)

选项1:使用像MongoDB这样的NoSQL数据库之一 - 我不熟悉这些数据库,因为我生活在一个主要的SQL Server世界中。这些允许您拥有作为文档的记录,而不是像关系DB的

那样的静态列数

选项2:关系数据库

表:日志{Id(PK),日期,时间,级别,消息} 表:ExtraFields {Id(PK),FieldName} 表:AdditionalFields {FieldId(PK),LogId(PK),Value}

这里每条记录都会获得一条Log记录,然后是AdditionalFields中的一些附加字段,它们会链接回LogId。然后,您可以将它们加载到Log对象中。 ExtraFields表将包含所有类型的字段。如果在加载记录时它不存在,则添加另一个记录。所以这可能有URL,IP,User-Agent等,如果它是web日志。

或者,您可以避免使用ExtraFields表,只需将字段名称直接放在AdditionalFields表中。