为不同的数据集构建数据库设计
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”存储两列,即。质量和体积;如果您最终要使用它们,它们可以减少到单个密度列。
如果有人有其他建议,请随时添加到此答案或作为您自己的答案。
【讨论】:
以上是关于为不同的数据集构建数据库设计的主要内容,如果未能解决你的问题,请参考以下文章