【问题标题】:Should I have one master equipment table or multiple property tables?我应该有一个主设备表还是多个属性表?
【发布时间】:2018-03-01 03:11:14
【问题描述】:

我正在尝试设计的设备数据库中有以下情况。我目前有 3 个表格,详细说明了 3 种不同类型的设备和 1 个表格,以保持所有 3 个表格中的所有 ID 都是唯一的。如下:

CREATE TABLE EQUIPMENT
(
    /*Primary key*/
    EQUIPMENT_ID         VARCHAR(30),

    PRIMARY KEY (EQUIPMENT_ID)
);

CREATE TABLE PIPING
(
    /*Primary key*/
    EQUIPMENT_ID         VARCHAR(30), 

    /*Generic Fields*/
    STATUS               VARCHAR(1),
    INSPECTION_STATUS    VARCHAR(1),
    REMEDIATION_STATUS   VARCHAR(1),

    /*Specific properties for piping equipment*/
    OUTSIDE_DIAMETER     FLOAT,
    WALL_THICKNESS       FLOAT,

    /*About another additional 50 specific fields*/

    PRIMARY KEY (EQUIPMENT_ID),
    FOREIGN KEY (EQUIPMENT_ID) REFERENCES EQUIPMENT(EQUIPMENT_ID)
);

CREATE TABLE VESSELS
(
    /*Primary key*/
    EQUIPMENT_ID         VARCHAR(30), 

    /*Generic Fields*/
    STATUS               VARCHAR(1),
    INSPECTION_STATUS    VARCHAR(1),
    REMEDIATION_STATUS   VARCHAR(1),

    /*Specific properties for vessel equipment*/
    DISHED_END_THICKNESS FLOAT,
    DESIGN_CODE          VARCHAR(25),

    /*About another additional 50 specific fields*/

    PRIMARY KEY (EQUIPMENT_ID),
    FOREIGN KEY (EQUIPMENT_ID) REFERENCES EQUIPMENT(EQUIPMENT_ID)

);

CREATE TABLE TANKS
(
    /*Primary key*/
    EQUIPMENT_ID            VARCHAR(30), 

    /*Generic Fields*/
    STATUS                  VARCHAR(1),
    INSPECTION_STATUS       VARCHAR(1),
    REMEDIATION_STATUS      VARCHAR(1),

    /*Specific properties for tank equipment*/
    FLOATING_ROOF_DIAMETER  FLOAT,
    FLOATING_ROOF_THICKNESS FLOAT,

    /*About another additional 50 specific fields*/

    PRIMARY KEY (EQUIPMENT_ID),
    FOREIGN KEY (EQUIPMENT_ID) REFERENCES EQUIPMENT(EQUIPMENT_ID)

);

将所有这些表合并为一个 150 列的主设备表会更好吗?或者让他们分开分组,记住以下几点:

  • 管道、容器和储罐表中的所有字段都与主键具有 1:1 的关系,并且都依赖于主键。

参考 stackoverflow 社区上有关此主题的其他帖子...

MySQL: multiple tables or one table with many columns?

由于主键和列之间的 1:1 关系,这种情况的最佳设计似乎是一个包含许多列的大表,但我还不相信,希望其他人对此事的想法.

【问题讨论】:

  • 我认为你不会得到明确的答案
  • @Strawberry 是什么让你这么说?
  • @Josh 没有明确的答案。这两种方法都行得通,但哪种方法更好取决于您的案例的很多细节。

标签: mysql database-design


【解决方案1】:

一些一般性意见,评论太长了:

EQUIPMENT_ID         VARCHAR(30) -- There's almost certainly no good reason for this not to be an auto-incrementing integer

STATUS               VARCHAR(1) -- CHAR(1) uses less memory and achieves the same thing.

OUTSIDE_DIAMETER     FLOAT -- It seems more plausible to me that this would be a DECIMAL, and likewise for all the other FLOATs

最后,如果您决定切换到 EAV 模型,请考虑为不同的数据类型设置单独的表,这样所有 DECIMAL 类型的东西都放在一个表中,而所有字符串类型的东西都放在另一个表中。

【讨论】:

  • 感谢 cmets 我将在我的代码中实现其中一些字段更改。
【解决方案2】:

这里有一种相关的技术。它被称为类表继承。还有更详细的here

【讨论】:

  • 您发布的那篇文章内容丰富。我现在确信单表继承在我的情况下是要走的路。但是是否选择类表继承的单表很大程度上取决于您的应用程序的具体情况。你能按照这个思路更新你的答案吗?然后我会将其标记为解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2016-11-18
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多