我需要数据库设计建议。我目前使用 SQLite(或者我可以切换到这些表的任何其他数据库)我有 A,B,C,D 列,行从 24 到 1008 . X 表示列是否为空。
我的第一个想法 ->我可以用 24 到 1008 做表 A、B、C、D(这看起来很愚蠢)
第二个想法 ->类似表 X(它有 id(FK) 到另一个表,我将在其中获得报告 ID),它有 24 到 1008,值将是 A、B、C 或 D,所以在这种情况下,示例查询是:从表 X 中选择 A 加入table_report ON table.report.id=X.id,其中 table_report.id=3;
所以通过 4 个查询,我将获得 A、B、C 和 D 的值,但是我现在很困惑
效率没什么大不了的自动取款机,但我不想设计一个愚蠢的东西。 我将用这些数据填充 HTML 表(Express+ejs)
我愿意接受任何建议
https://i.hizliresim.com/PO7PV5.png
用您提供的有限信息不可能给出最佳设计。但是你可能需要研究RDB设计的一些原则。
表示图像中显示的内容的自然方式是作为唯一对的表,其中每对表示一个带有 X 的条目:
CREATE TABLE schedule (
hour INTEGER PRIMARY KEY,
tag TEXT PRIMARY KEY
);
请注意,我猜数字水平轴的名称为"小时",垂直 A - D 轴的名称为"tag",因为您没有提到这些值的实际含义。
您将使用触发器强制实施其他数据约束:
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 = ?;