0

我需要一个数据库设计建议。我目前正在使用 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

1 回答 1

0

您提供的信息有限,不可能给出最佳设计。但是您可能需要学习一些 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 = ?;
于 2017-11-06T04:59:20.643 回答