未知列数的表格

4
我们正在设计一个小型数据库,用于存储有关我们软件使用情况的数据。因此,在我们的程序/网站中,我们将调用一个小服务来记录有关会话和执行操作的一些数据。这样,我们就可以看到我们程序的哪些部分被广泛使用,最常见的使用场景是什么等等。
我遇到的问题是如何持久化所有不同类型的操作。由于我们不知道所有应用程序和未来应用程序需要什么确切的操作和参数,所以很难决定数据结构。
目前看起来像这样:
Actions -------------- + Id + ActionTypeId + SessionId + TimeStamp + Data01 + Data02 + Data03 ... + Data10 + DataBlob
我特别担心的是所有数据字段。实际上,它要么太多列,要么太少列。在一个字段中连接它们将很难查询。
有什么建议吗?
7个回答

7
使用另一个表格,其中包含 标签。
Data
---------
+ Value
+ ActionId

接着将两个表格合并,如下所示:

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

4
一种方法是将数据的可灵活调整的模式部分存储在XML字段中 - 在SQL 2005中有一个XML数据类型,可以索引和查询而不需要你在SQL 2005之前所遇到的痛苦。
或者,建立一个包含通用数据并链接到包含特定操作类型数据的单独表格的主表格。

我们在应用程序日志表中使用XML解决方案,并且它运行良好。在大多数情况下,我是一个关系纯粹主义者,但这是一个例外,我认为它很好-它不是面向外部的,并且对该表的利用 tend to 是众所周知的用途子集。如果您确实需要在查询中获取特定项,则可以使用xquery。 - Tom H

2
如何创建一个ActionsData表,每个数据都有一行,并且外键指向相应的操作。
ActionID
Property
Value

2

添加更多的表格并建立关联

 Actions
 --------------
 + ActionID
 + ActionTypeId

 Actions-Log
 --------------
 + ActionID
 + LogID

 Log
 --------------
 + LogID
 + SessionId
 + TimeStamp
 + Data

或者

由于这是一份日志,因此也许需要使用XML解决方案。


其实,我认为你甚至不需要三个表。两个应该就可以了。只需将日志表与ActionID关联即可。 - DA.

1

非关系型数据库,例如CouchDb是一个选择吗?我没有使用过它,但从我所读到/听到的内容来看,它可能适合您。

您可能只需存储以下内容:

操作

  • Id
  • ActionTypeId
  • SessionId
  • TimeStamp
  • DataObject

我喜欢你的创新思维,但是考虑到这将是一个被许多不同类型的项目在许多不同类型的语言中使用的系统,并由许多不同类型的程序员支持,我希望保持它的老派风格 ;) - Boris Callens

0
标准答案是将数据值放入单独的表格中,使用Action表中的Id作为外键插入到数据表中。也就是说,一个Action看起来像这样:
Id
ActionTypeId
SessionId
TimeStamp

你将拥有一个类似于数据表的东西,看起来是这样的:
ActionId
DataType
DataValue

0
您还可以查看观察者模式,例如this question/answer。 在您的示例中,Subject = Action

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接