我想创建一个票务PHP应用程序,但我在数据库结构的规划方面犹豫不决。
我将拥有完全不同类型的票证模板(用户/共享文件夹/终端设备进程等)需要不同的输入。
问题是,我应该将它们存储在一个表中,还是应该为每个票务组创建一个单独的表?
如果我将它们存储在一个表中,表中将有许多空字段,因为不同的票证使用不同的字段。
我认为常见的字段只有unique ID、status和responsible person,其他字段则不同。
我的首选解决方案是,如果我将它们存储在单独的表中,只包含所需的字段。
但是,当我想列出每一张票时,这会在一个简单的SELECT查询中导致麻烦。如果我在查询期间将它们连接在一起,它将创建一个包含许多空字段的结果表,因为表的结构之间存在差异,这不是最优的。为了避免这种情况,我应该对每个表运行单独的查询,这并不简单。
你会选择哪种方式?你能给我提个建议吗?提前谢谢你!
发布于 2018-01-21 12:25:43
不要将不同的实体放在同一个表中。是的,它们有一些公共字段,但是一堆空列是一个明确的信号,表明应该避免这种设计,好的迹象是您已经意识到了这一点:)如果我们现在从数据库世界跳到具有OO模式和类的应用程序世界,这通常会通过继承( is -一种关系)来解决。如何在SQL (特别是MySQL)中强制执行此操作?
用一个公共表将数据划分到单独的表中,我们称之为ticket_template,它将包含公共字段(您提到了template_id、status和responsible person)。其他表(如user_template )将创建如下所示:
CREATE TABLE user_template(
user_template_id int PRIMARY KEY REFERENCES ticket_template(template_id)
...
);他们应该保留特定于特定实体的字段。如果您想要一个通用报表,请编写多个SQL选择并逐一显示其结果。如果您想将它们全部放在一起,只需列出共同的字段。
注意-此设计并不能防止混淆的用户插入与任何具体模板(如user_template)无关的或与其中许多模板(超过1)相关的user_template。如果数据库支持延迟约束(不幸的是,MySQL不支持),也可以强制执行,请读取更多的here。
https://stackoverflow.com/questions/48364892
复制相似问题