gpt4 book ai didi

database-design - 数据库日志表结构

转载 作者:行者123 更新时间:2023-12-04 18:14:20 24 4
gpt4 key购买 nike

我正在创建一些用于存储日志条目的数据库表。在正常情况下,我总是会标准化并且从不将值放在一起,但我不是 100% 相信这是一个好主意。

我可以正常化并拥有:

  • 日志条目
  • 日志条目类别
  • 日志分类
  • LogEntryProperty

  • LogEntry 与 LogCategory 具有多对多关系,LogEntry 与 LogEntryProperty(它们是名称/值对)具有一对多关系。

    另一种选择是非规范化版本,它只有 LogEntry,其中类别存储为逗号分隔的字符串类别列表,属性存储为 Name:Value 格式属性的逗号限制列表。尽管这听起来很丑陋,但从报告、性能和可搜索性的角度来看,我不确定这是否更好。

    哪个是更好的主意?

    谢谢。

    最佳答案

    因为只有一个几个不同的属性 ,我会远离名称-值对,并为每个属性提供一个单独的表 具有正确的名称和数据类型 .我用过通用 Property_ ,仅用于演示。

    enter image description here

    这里的事情是确保如果缺少值,不要将值插入到属性表中,换句话说,所有属性值都不是 NULL。

    为了让生活更轻松,定义一个 View

    create view dbo.vLogs AS
    select
    LogCategoryName
    , LogTime
    , p1_Value
    , p2_Value
    , p3_Value
    , p4_Value
    , p5_Value
    from LogEntry as e
    left join Property_1 as p1 on p1.LogEntryId = e.LogEntryId
    left join Property_2 as p2 on p2.LogEntryId = e.LogEntryId
    left join Property_3 as p3 on p3.LogEntryId = e.LogEntryId
    left join Property_4 as p4 on p4.LogEntryId = e.LogEntryId
    left join Property_5 as p5 on p5.LogEntryId = e.LogEntryId
    left join LogEntryCategory as x on x.LogEntryId = e.LogEntryId
    left join LogCategory as c on c.LogCategoryID = x.LogCategoryID

    这个 View (查询)看起来复杂而冗长;但是,如果您尝试像下面这样的查询并查看执行计划,您可能会注意到选择列表中未提及的属性表未包含在计划中(未触及)。
    select
    LogCategoryName
    , LogTime
    , p1_Value
    , p2_Value
    from dbo.vLogs
    where LogCategoryName = 'some_category'
    and LogTime between from_time and to_time

    如果你需要像这样简单的东西
    select max(p1_Value)
    from dbo.vLogs
    where LogTime between '2011-07-18' and '2011-07-19'

    这是执行计划,您可以看到只涉及两个表。

    enter image description here

    这称为表(连接)消除,您确实需要 SQL Server、Oracle、PostgreSql 9.x,... 才能使其工作 - 不适用于 MySql(目前)。

    每次添加属性时,您都必须添加一个新表并修改 View 。

    关于database-design - 数据库日志表结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6751934/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com