【问题标题】:Two Dimensional Database Design -SQL or JSON二维数据库设计 - SQL 或 JSON
【发布时间】:2017-11-06 04:06:29
【问题描述】:

我需要数据库设计建议。我目前正在使用 SQLite(或者我可以为这些表切换到任何其他数据库)我有 A、B、C、D 列,其中行从 24 到 1008 。 X 表示该列是否为空。

我的第一个想法-> 我可以用 24 到 1008 做表 A、B、C、D(这似乎很愚蠢)

第二个想法 -> 类似于表 X(它的 id(FK) 到另一个我将获取报告 ID 的表),它有 24 到 1008,值将是 A、B、C 或 D,所以在这种情况下示例查询是:SELECT A from table X JOIN table_report ON table.report.id=X.id where table_report.id=3;

所以通过 4 个查询,我将获得 A、B、C 和 D 的值,但是我现在很困惑

效率并不是什么大问题,但是我不想设计一个愚蠢的东西。我将用这些数据填充 HTML 表格 (Express+ejs)

我愿意接受任何建议

https://i.hizliresim.com/PO7PV5.png

【问题讨论】:

  • 请向我们展示数据的样子。通常,4 列与 4 个表不是您将面临的决策选择。
  • @TimBiegeleisen 实际上没有数据。每列都有复选框。要么检查要么不检查。 i.hizliresim.com/EyO5jB.png

标签: json database sqlite rolap


【解决方案1】:

您提供的信息有限,不可能给出最佳设计。但是您可能需要学习一些 RDB 设计原则。

表示您在图像中显示的内容的自然方式是作为唯一对的表格,其中每一对表示一个带有 X 的条目:

CREATE TABLE schedule (
  hour INTEGER PRIMARY KEY,
  tag TEXT PRIMARY KEY
);

请注意,我猜数字水平轴的名称为“小时”,垂直 A - D 轴的名称为“标签”,因为您没有提及这些值实际上是什么。

您将使用触发器强制执行额外的数据约束:

CREATE TRIGGER validate_schedule_insert BEFORE INSERT ON schedule
BEGIN
  SELECT CASE 
    WHEN NEW.hour NOT IN (24, 48, ...) OR NEW.tag NOT IN ("A", "B", "C", "D")
    THEN RAISE (ABORT 'Bad pair')
  END;
END;

表中的最大条目数为 4 * 42 = 164。您将检查给定条目是否有 X:

SELECT * FROM schedule WHERE hour = ? AND tag = ?;

这将分别为 X 或无 X 返回 1 或 0 个结果。

当然,您可以通过单个查询了解给定小时内带有 X 的所有标签:

SELECT tag FROM schedule WHERE hour = ?;

【讨论】:

  • 实际上没有数据,想象一下每个 A、B、C、D 及其相关时间的复选框。数据:是否打勾
  • 我从来没有说过除了 X 的存在或不存在之外还有任何数据。@emredeli
  • @emredeli 如果您在谈论我提到的“数据约束”,那是指允许数据库仅接受有效对。 IE。您不希望它接受一对 ("E", 99),因为它们不在轴上。
  • 我明白你的意思,我的计划是读取值 A1、A2(最多 42)和 D1、D2 等的 req.body。之后我需要将这些值记录到数据库中
  • 我的意思是A24是否打勾
猜你喜欢
  • 1970-01-01
  • 2022-11-14
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多