【问题标题】:Store multiple datasets in single table将多个数据集存储在单个表中
【发布时间】:2010-12-24 15:11:29
【问题描述】:

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

我想将结果数据集存储在一个通用模式中,以便我可以查询过去 3 个月内特定客户的 Check A 中的任何错误。或者,检查 B 有多少次针对不同的事务返回错误。其他表也将管理问题解决等。到目前为止,我想出的唯一东西是一个有大约 20 列的表,一列与特定检查有关,一列用于日期/时间,其余的是某种形式的 varchar 能够保存任何类型的数据。这让我畏缩的原因有很多,但性能排名很高。我希望避免每次检查都使用单独的表,但将其与辅助功能的查找表结合起来可能是唯一的方法。

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

【问题讨论】:

    标签: database-design


    【解决方案1】:

    您可以将这大约 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_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_int、dataset_values_text 等)。每个子表只需要两列——一列保存值,第二列引用父表。

    (1) 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 - 但对于其他子表会有所不同。)

    【讨论】:

    • 这听起来是我迄今为止听到的最好的选择。我什至不知道为什么我为此考虑了静态列数。
    • 这是我用的。如果您想更喜欢它,您可以在类型表中创建另一个(枚举)列,该列存储应该匹配/强制在数据上的 SQL 类型。然后,当您插入/选择时,您可以使用该列将值强制转换为正确的类型(在 mysql 中,这将类似于:SELECT CAST(value AS VARCHAR) FROM values_table)或使用它来验证插入/更新触发器。显然,要将类型转换动态添加到查询中,您需要通过存储过程来执行此操作。但是,通过使用 SP,您不需要为每种可能的类型创建一个表。
    【解决方案2】:

    嗯嗯。这里只是头脑风暴。您真的需要存储支票数据吗?或者只是一个参考以便能够查找它?一个表来存储检查类型,然后是一个相关的表来存储 chekc id、检查类型、检查日期以及您可能需要的任何其他数据。然后是另一个相关表,用于存储检查 id 和检查失败记录的记录 id。

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

    如果您真的觉得必须将数据存储在一条记录中,这可能是存储 xml 文档的地方。

    【讨论】:

    • 一些检查是时间点数据,我可能不一定能够在事后重新创建,但可能仍需要参考。这是我希望解决的另一个问题,因为现在我通过在日志文件中搜索错误并查看纯文本数据集来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2018-06-21
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多