postgresql - 定义子实体与使用类型列之间的性能差异
问题描述
假设我想为具有相同属性(例如类别)的众多实体创建一个大表。
有几个顶级类别永远不会改变,例如 A、B 和 C。所有其他类别要么是这些顶级类别的子类别,要么是相关类别。
哪种方法会更高效:
- 使 A、B 和 C 成为数据库中的枚举列,并为顶级类别不提供父级。
| id | name | type | parentId |
|----|---------------|------|----------|
| 1 | Category 1 | A | |
| 2 | Category 2 | B | |
| 3 | Category 3 | C | |
| 4 | Subcategory 1 | A | 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 |
解决方案
两者似乎都错了。假设您有:
- 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 )
推荐阅读
- python - 我如何告诉python整个值是一个字符串?因为我的excel公式中有撇号
- nginx - 如果第一个地址不可用,则 Proxy_pass 到第二个地址(例如 502)
- node.js - 页面未呈现 totaljs
- c# - 如何将 PayUMoney BOLT 与 MVC4 c# 集成?
- node.js - 如何使用 REST API 将工作项创建到 TFS
- java - java库中的静态字段
- python - Django mpld3 显示 json 可序列化错误
- python - MLflow 运行示例给了我 CommandNotFoundError
- java - 如何使用 Spring Boot 应用程序初始化 log4j?
- typescript - 从 React Native 过渡到 Flutter 时最重要的方面