首页 > 解决方案 > 定义子实体与使用类型列之间的性能差异

问题描述

假设我想为具有相同属性(例如类别)的众多实体创建一个大表。

有几个顶级类别永远不会改变,例如 A、B 和 C。所有其他类别要么是这些顶级类别的子类别,要么是相关类别。

哪种方法会更高效:

  1. 使 A、B 和 C 成为数据库中的枚举列,并为顶级类别不提供父级。
| id | name          | type | parentId |
|----|---------------|------|----------|
| 1  | Category 1    | A    |          |
| 2  | Category 2    | B    |          |
| 3  | Category 3    | C    |          |
| 4  | Subcategory 1 | A    | 1        |
  1. 将所有其他类别嵌套在 A、B 和 C 顶级行之下。
| id | name          | parentId |
|----|---------------|----------|
| 1  | Category 1    |          |
| 2  | Category 2    |          |
| 3  | Category 3    |          |
| 4  | Subcategory 1 | 1        |
| 5  | Subcategory 2 | 2        |
| 6  | Subcategory 3 | 3        |

标签: postgresqldatabase-design

解决方案


两者似乎都错了。假设您有:

  • 1 个类别可以有多个子类别
  • 1 个子类别可以有一个类别

如果是这样:使两个表由外键连接。

在 RDBMS 中,“R”表示 RELATIONNAL。


CREATE TABLE Category (id int primary key, name varchar(255));
CREATE TABLE SubCategory (id int primary key, name varchar (255), idCategory int references Category (id));

想象有一天:您必须在子类别中添加一个子类型:您必须添加一个大部分为空的列,并注意没有类别将有子类型的规则(因为它必须只是一个子类别属性)。信任正常形式(https://www.geeksforgeeks.org/normal-forms-in-dbms/

无论如何:永远不要忘记,在大多数情况下,大量列而不是表之间的关系是一个坏主意。(反模式3:https ://pdfs.semanticscholar.org/9860/30462074badbb819e0804a0bdba79fd6b915.pdf )


推荐阅读