【问题标题】:Table with unknown number of columns列数未知的表
【发布时间】:2009-12-17 04:19:00
【问题描述】:

我们正在设计一个小型数据库,其中包含有关我们软件使用情况的数据。 因此,在我们的程序/网站中,我们将调用一个小服务来记录有关会话和执行的操作的一些数据。这样我们就可以看到我们程序的哪些部分被大量使用,最常见的使用场景是什么等等。

我正在努力解决的部分是我们将如何坚持所有不同类型的操作。 因为我们不知道所有应用程序和未来的应用程序需要哪些确切的操作和参数,所以很难决定数据结构。

目前它看起来像这样:

行动 -------------- + 身份证 + ActionTypeId + 会话 ID + 时间戳 + 数据01 + 数据02 + 数据03 ... + 数据10 + 数据块

我特别怀疑所有数据字段。在实践中,它要么是很多列,要么是太少。将它们连接在一个字段中将是地狱般的查询。

有什么建议吗?

【问题讨论】:

    标签: sql database-design


    【解决方案1】:

    使用另一个表,与

    Data
    ---------
    + Value
    + ActionId
    

    然后合并两个表,如

    select Value from Data, Action where Data.ActionId = Action.Id and ...
    

    【讨论】:

      【解决方案2】:

      一种方法是将数据的灵活模式部分存储在 XML 字段中 - 在 SQL 2005 中,有一个 XML datatype 可以被索引和查询,而不会像 SQL 2005 之前那样痛苦。

      或者,有一个包含公共数据的主表,然后链接到包含操作类型特定数据的单独表。

      【讨论】:

      • 我们在这里为我们的应用程序日志表使用 XML 解决方案,它运行良好。在大多数情况下,我是一个关系纯粹主义者,但这是一个我认为很好的例外 - 它不是面向外部的,并且表格的使用往往是众所周知的使用子集。如果您确实需要在查询中执行此操作,可以使用 xquery 获取特定项目。
      【解决方案3】:

      ActionsData 表怎么样,每条数据都有一行,外键指向相应的操作。

      ActionID
      Property
      Value
      

      【讨论】:

        【解决方案4】:

        添加更多表并设置关系

         Actions
         --------------
         + ActionID
         + ActionTypeId
        
         Actions-Log
         --------------
         + ActionID
         + LogID
        
         Log
         --------------
         + LogID
         + SessionId
         + TimeStamp
         + Data
        

        因为它是一个日志,所以在大多数情况下,也许 XML 解决方案是合适的。

        【讨论】:

        • 实际上,我认为您甚至不需要 3 张桌子。 2应该工作。只需为 Log 表提供对 ActionID 的引用
        【解决方案5】:

        可以选择像 CouchDb 这样的非关系型数据库吗?我没有这方面的经验,但从我读过/听说过的情况来看,它可能对你很有效。

        你可能只需要存储这个就可以逃脱:

        动作

        • 身份证
        • ActionTypeId
        • 会话 ID
        • 时间戳
        • 数据对象

        【讨论】:

        • 我喜欢你开箱即用的想法,但我认为因为这将是一个由许多不同类型的项目以许多不同类型的语言使用的系统,由许多不同类型的程序员支持我想保留它 oldskool ;)
        【解决方案6】:

        标准答案是将数据值放入单独的表中,并将 Action 表中的 Id 作为数据表中的外键。 IE。一个动作看起来像:

        Id
        ActionTypeId
        SessionId
        TimeStamp
        

        然后你会有一个看起来像这样的数据表:

        ActionId
        DataType
        DataValue
        

        【讨论】:

          【解决方案7】:

          您还可以查看观察模式,如 this question/answer。 我是你的例子Subject = Action

          【讨论】:

            猜你喜欢
            • 2022-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-04
            • 2022-01-04
            • 2015-03-07
            相关资源
            最近更新 更多