我想创建一个票证PHP应用程序,但我坚持规划数据库结构。
我会有完全不同类型的故障单模板(用户/共享文件夹/终端设备进程等),它们需要不同的输入。
问题是,我应该将它们存储在一个表中,还是应该为每个故障单组创建一个单独的表?
如果我将它们存储在一个表中,表中会有很多空字段,因为不同的票证使用不同的字段。
我认为常见字段只是unique ID
,status
和responsible person
,其他字段不同。
我的首选解决方案将是我将它们存储在仅包含必填字段的单独表格中。
但是当我想列出每张票时,这会在简单的SELECT查询中导致麻烦。如果我在查询期间将它们连接在一起,它将创建一个包含许多空字段的结果表,因为表的结构之间的差异不是最佳的。为了避免这种情况,我应该为每个表运行单独的查询,这不是那么简单。
你会选择什么方式?你能给我一个建议吗? 提前谢谢!
答案 0 :(得分:0)
切勿将不同的实体放在同一个表中。是的,它们有一些共同的领域,但是一堆空列是一个明确的信号,应该避免这样的设计,并且好的迹象是你意识到它:)如果我们从数据库世界跳进应用程序世界对于OO模式和类,这通常通过继承(is-a relationship)来解决。如何在SQL(特别是MySQL)中强制执行此操作?
将单独表格中的数据与一个公用表格分开,我们将其称为ticket_template
,其中包含公共字段(您提到template_id
,status
和{{1} })。其他表格,例如responsible person
将创建如下:
user_template
并且他们应该保留特定于特定实体的字段。如果需要通用报告,请编写多个SQL选择并一个接一个地显示其结果。如果你想把所有这些放在一起,只需将常用字段列在一起。
警告 - 此设计不会阻止混淆用户插入与任何具体模板(例如CREATE TABLE user_template(
user_template_id int PRIMARY KEY REFERENCES ticket_template(template_id)
...
);
)无关的ticket_template
,或与其中许多模板相关的user_template
(超过1)。如果数据库支持延迟约束(不幸的是,MySQL没有),也可以强制执行,请阅读更多here。