如果有两个类型相同但性质不同的对象,该使用哪种表结构?

时间:2019-07-11 18:56:44

标签: sql database-design mariadb database-performance database-normalization

给定X和Y有两种乘积。X以A,B和C作为主键,而Y以A和D作为主键。我应该把它们放在同一张桌子上吗?为什么我应该,如果我不应该,那为什么呢?

我目前将它们放在两个单独的表中,但是一些同事建议它们属于同一表。我的问题是我应该考虑将它们放在同一个表中还是继续使用不同的表?

下面,我给出了上述情况的示例表。

CREATE TABLE `product_type_b` (
    `PRODUCT_CODE` VARCHAR(50) NOT NULL,
    `COMPONENT_CODE` VARCHAR(50) NOT NULL,
    `GROUP_INDICATOR` VARCHAR(50) NULL DEFAULT NULL,
    `RECORD_TIMESTAMP` DATE NULL DEFAULT NULL,
    PRIMARY KEY (`PRODUCT_CODE`, `COMPONENT_CODE`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `product_type_a` (
    `PRODUCT_CODE` VARCHAR(50) NOT NULL,
    `CHOICE_OF_COVER` VARCHAR(50) NOT NULL,
    `PLAN_TYPE` VARCHAR(50) NOT NULL,
    `RECORD_TIMESTAMP` DATE NULL DEFAULT NULL,
    `PRODUCT_TENURE` INT(11) NULL DEFAULT NULL,
    PRIMARY KEY (`PRODUCT_CODE`, `CHOICE_OF_COVER`, `PLAN_TYPE`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;

如您所见,某些字段不是两个表都共有的,而是主键的一部分。还有一些其他字段不是两个表都共有的。

这是正在考虑的系统的整体图。

  • 每种产品类型与发送到系统的来源都有不同的来源。
  • 我们需要将这些产品存储在数据库中。
  • 我希望在规范化和性能之间保持平衡,以免由于过度规范化而影响我的读写速度。
  • 还有一个网络应用程序,它将具有一个页面,用户可以在其中搜索这些产品。
  • 用户将根据需要获取产品并显示在UI上的特定列字段填充为过滤器。
  • 当前亚型的变异为2,预计不会增加到4-5以上 也许要超过十年。这又是一个近似值。 我希望这可以对系统有一个更大的了解。

我希望在不影响性能的前提下具有良好的读写速度。那我应该继续进行这种设计吗?如果没有,应该执行什么设计?

2 个答案:

答案 0 :(得分:1)

这是典型的类别/子类别模型问题。有几种选择:

  1. 将所有内容放入一个表中,该表中的某些列可为空 因为不同的子类型没有相同的属性;

  2. 一个父表包含所有常见属性,并且还带有     类型指示列的列。然后每个子类型都有自己的     表格仅用于子类型的列。

  3. 每个子类型都有自己的表,包括表的所有公共列     所有子类型。

(1)如果子类型非常有限,则很好;
如果子类型的变化非常有限,则使用(3)是合适的。

(2)的优点。是否很容易返回具有公共列的所有记录。而且,如果使用了人工键(例如自动递增ID),它可以确保所有记录(不考虑子类型)都具有唯一ID。

在您的情况下,不使用人工PK,我认为您的选择还不错。

答案 1 :(得分:1)

对于一个交易系统,考虑到最多5种产品类型和非常有限的属性,我希望所有带有替代PK的产品都使用一个表。考虑一下交易交易中对产品的引用,从长远来看,这是数据库总内容的最大部分。

描述每个产品特定属性及其到常规表列的映射的元数据表将有助于构建UI和后端/前端通信。

根据产品类型,搜索索引将反映最受欢迎的用户搜索内容。