将多个数据集存储在单个表中

时间:2009-12-08 22:41:17

标签: database-design

我正在集思广益一个应用程序来处理各种数据完整性检查。每个单独的检查可以查询许多生产表,评估结果并报告错误,提供与检查相关的数据。例如,一次检查会查找预定付款但没有剩余余额的客户;不同的支票可能会查找已获得授权但未结算超过3天的信用卡交易。两个完全不相关的检查。来自第一个的数据集将包含客户编号,预定付款日期,支付日期等内容。第二个检查将包括交易号,卡类型,卡的最后4位数,金额等。

我想将结果数据集存储在一个公共模式中,以便在过去3个月内查询特定客户的Check A中的任何错误。或者,Check B为不同的事务返回了多少次错误。其他表也可以管理问题解决等。到目前为止,我唯一想到的是一个包含~20列的表,一列与特定检查相关,一列用于日期/时间,剩下的将是某种形式的varchar,能够保存任何类型的数据。这有很多原因让我感到畏缩,但是那里的表现相当高。我希望为每个检查避免使用单独的表,但将其与查找表结合使用可能是唯一的方法。

对于好奇的我试图将其保留在Microsoft世界(VB.NET和SQL Server)中,但我对其他想法持开放态度。

2 个答案:

答案 0 :(得分:2)

您可以将这些~20列拉出到一个标准化的“值”表中。 您可以拥有一个查找表,该表与每个检查类型的预期字段相结合。

说明我的建议:

<强> check_datasets

  • dataset_id(PK)
  • check_id(这将是失败的支票的ID)
  • datetime

<强> value_types

  • value_type_id(PK)
  • name

<强> dataset_value_types

  • value_type_id(FK,PK)
  • dataset_id(FK,PK)

<强> dataset_values

  • dataset_id(FK,PK)
  • value_type_id(FK,PK)
  • value(此列代表数据的值)

----------

所以在上面的表中解释一下:

  • check_datasets 是保存每次失败检查的表(我假设您只记录失败的检查 - 否则,您可能想要添加通过/成功标记到这张表)。
  • value_types 是一个简单的查找表,用于提供值字段的名称。
  • dataset_value_types 用于定义哪些检查具有哪些类型的值字段(这是check_datasets表和value_types之间的多对多关系)
  • dataset_values 是保存每项支票的具体值的表格。

此设计提供了一种标准化且简便的方法,可以查询返回的每个“数据集”所需的每个值。


此设计的缺点是您在一个字段(value)中仍然具有混合数据类型。

如果要分隔数据类型,可以将 dataset_values 子类型分为单独的表(即:一个表用于整数值,一个用于varchars,LOB等)。

在上面的示例中,这意味着要为数据类型创建所需数量的子表(例如:dataset_values_intdataset_values_text等)。每个子表只需要有两列 - 一列保存值,第二列引用父表。

(1)dataset_values将成为父表,可能看起来像这样:

<强> dataset_values

  • dataset_value_id(PK)
  • dataset_id(FK)
  • value_type_id(FK)
  • datatype(此值是整数,varchar等。此列告诉您要检查哪个子表的表)

(2)示例子表将是:

<强> dataset_values_varchar

  • dataset_value_id(PK,FK)
  • value(在此表中,这将是一个varchar - 但对于其他子表会有所不同。)

答案 1 :(得分:0)

Hmmmm。只是在这里集思广益。你真的需要存储检查数据吗?或者只是一个能够查找它的参考?如何存储检查类型的表,然后是存储chekc id的相关表,检查类型,检查日期以及您可能需要的任何其他数据。然后是另一个相关表,用于存储检查失败的记录的检查ID和记录ID。

另一种方法是我们如何存储我们的审计表数据,一个varchar(实际数据的最大值)列,它表示它所属的列(在​​您的情况下,它所属的表可能是一个单独的列)然后将其与已执行的检查相关联的列。

如果您确实认为必须将数据存储在一条记录中,则可能是存储xml文档的位置。