列数未知的表

时间:2009-12-15 16:34:04

标签: sql database-design

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

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

目前它看起来像这样:

   Actions
--------------
+ Id
+ ActionTypeId
+ SessionId
+ TimeStamp
+ Data01
+ Data02
+ Data03
...
+ Data10
+ DataBlob

我对所有数据域都特别怀疑。在实践中,它将是许多列的方式或太少。所有在一个字段中将它们连接在一起的内容都将无法查询。

有任何建议吗?

7 个答案:

答案 0 :(得分:7)

使用另一张表

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

然后组合两个表,如

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

答案 1 :(得分:4)

一种方法是将数据的灵活模式部分存储在XML字段中 - 在SQL 2005中,有一个XML datatype,可以对其进行编制索引和查询,而不会产生前SQL的痛苦2005。

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

答案 2 :(得分:2)

ActionData表如何,每行数据都有一行,外键指向相应的操作。

ActionID
Property
Value

答案 3 :(得分:2)

添加更多表格并设置关系

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

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

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

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

答案 4 :(得分:1)

像CouchDb这样的非关系数据库是一个选项吗?我没有这方面的经验,但从我读过/听到的内容来看,它可能适合你。

你可能只是存储这个:

  

行动

     
      
  • 编号
  •   
  • ActionTypeId
  •   
  • 的SessionID
  •   
  • 时间戳
  •   
  • 数据对象
  •   

答案 5 :(得分:0)

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

Id
ActionTypeId
SessionId
TimeStamp

然后你会有一个类似于:

的数据表
ActionId
DataType
DataValue

答案 6 :(得分:0)

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