为不同的数据集构建数据库设计

Posted

技术标签:

【中文标题】为不同的数据集构建数据库设计【英文标题】:Structuring database design for different sets of data 【发布时间】:2019-12-23 23:37:14 【问题描述】:

我正在尝试设计一个允许您创建不同类型的报告的报告数据库。因此,我有我的主报告表(我正在创建 Laravel 迁移)。

Schema::create('reports', function (Blueprint $table) 
    $table->increments('id');
    $table->string('report_name');
    $table->string('status')->nullable();
    $table->integer('removed_count')->default(0);
);

因此,报告可以是 3 种不同类型的报告之一。因此,我有一个 report_types 表

Schema::create('report_types', function (Blueprint $table) 
    $table->increments('id');
    $table->unsignedInteger('report_id');
    $table->string('report_type');

    $table
        ->foreign('user_id')
        ->references('id')
        ->on('reports')
        ->onDelete('cascade');
);

因此,报告将与报告类型具有一对一的关系。本质上,当您创建报表时,您可以创建报表 A、报表 B 或报表 C。

这就是我困惑的地方。每种报告类型都需要捕获不同的数据。例如,如果他们选择报告 A,我可能需要捕获以下内容。

Schema::create('report_a_data', function (Blueprint $table) 
    $table->increments('id');
    $table->unsignedInteger('report_id');
    $table->string('cust_id');
    $table->string('col1');
    $table->string('col2');
    $table->string('col3');

    $table
        ->foreign('report_id')
        ->references('id')
        ->on('reports')
        ->onDelete('cascade');
);

如果他们选择报告 B,我需要捕获的数据是不同的。所以我的问题是我是否为我需要捕获的每个报告数据创建一个表格?所以我会为每个报告提供一个像上面这样的表格吗?如果我这样做,有一个 report_types 表有意义吗?而对于上面的表格,是否应该直接链接到报告表格?

非常感谢任何有关如何正确构建它的建议。

【问题讨论】:

How can you represent inheritance in a database? 这是一个常见问题解答。在考虑发布之前,请始终在谷歌上搜索任何错误消息和许多清晰、简洁和准确的问题/问题/目标的措辞,带或不带您的特定字符串、名称和行号以及带和不带“site:***.com”并阅读很多点击和答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS 但是在赏金下,问题不能被近距离投票。 您使用什么 RDBMS? 【参考方案1】:

在您的情况下,数据是半结构化的。 RDBMS 可能不适合您,因为您的数据不是完全结构化的。另一方面,您的数据也不是非结构化的。

有了这些知识,您现在可以在设计数据库时做出更明智的决定。在我的脑海中,我有四个建议。选择一个或混合搭配。


1。使用 NoSQL DBMS

如果您的其他数据源也不是结构化的,则可以考虑使用 NoSQL DBMS。与其尝试塑造一个自然的非结构化数据源,不如正确选择 DBMS。


2。制作单独的表格

为每种类型的报告创建一个单独的表格。

例如:

Report_A - Report_Id, Col_1, Col_2, Col_3, .., Col_a

Report_B - Report_Id, Col_1, Col_2, Col_3, .., Col_b

Report_C - Report_Id, Col_1, Col_2, Col_3, .., Col_c

您必须做出的主要权衡是使用不相关的 JOINS。您必须执行完整的外部连接并填充相关列,同时将其他不相关的列设置为 null


3。将报告放入 XML 列中

将整个报告存储为 XML。因此,XML 节点将根据列中报告的类型而有所不同。 JOINS 将很简单,但在应用程序级别需要额外的工作来管理查询的数据。


4。调查报告结构

从足够一般的角度来看,探索每种报告类型的独特列是否是相同类型的数据/信息。如果这是可行的,您的报告可以收敛到相同的“一般”报告结构。

例如。

报告“a”中的流体质量;并且, 报告“b”中容器内固体的分子计数;

在报告的通用版本中都可以写成“浓度”。

此外,如果报告“a”存储两列,即。质量和体积;如果您最终要使用它们,它们可以减少到单个密度列。


如果有人有其他建议,请随时添加到此答案或作为您自己的答案。

【讨论】:

以上是关于为不同的数据集构建数据库设计的主要内容,如果未能解决你的问题,请参考以下文章

数据访问设计:多个结果集单个存储过程或每个存储过程单个结果集

重复性事件的数据库设计与异常

IT 支持业务的 OLAP 多维数据集设计参考 [关闭]

在多维数据集设计中接近操作期间的混合粒度日期维度

Keras深度学习实战(39)——音乐音频分类

具有多种功能的产品的数据库设计