Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 定义子实体与使用类型列之间的性能差异_Postgresql_Database Design - Fatal编程技术网

Postgresql 定义子实体与使用类型列之间的性能差异

Postgresql 定义子实体与使用类型列之间的性能差异,postgresql,database-design,Postgresql,Database Design,假设我想为具有相同属性的多个实体创建一个大表,例如类别 有几个顶级类别永远不会改变,例如A、B和C。所有其他类别都是这些顶级类别或相关类别的子类别 哪种方法更有效: 使A、B和C成为数据库中的枚举列,并使顶级类别没有父类别 创建A、B和C顶层行,所有其他类别都嵌套在该行下 两者似乎都错了。假设您有: 1类别可以有多个子类别 1子类别可以有一个类别 如果是:使两个表由外键连接 在关系数据库管理系统中,“R”表示关系 CREATE TABLE Category (id int primary

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

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

哪种方法更有效:

  • 使A、B和C成为数据库中的枚举列,并使顶级类别没有父类别
  • 创建A、B和C顶层行,所有其他类别都嵌套在该行下

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

    • 1类别可以有多个子类别
    • 1子类别可以有一个类别
    如果是:使两个表由外键连接

    在关系数据库管理系统中,“R”表示关系

    
    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));
    
    想象有一天: 您必须将子类型添加到子类别中:您必须添加一个基本为空的列,并谨慎使用任何类别都不会有子类型的规则(因为它只能是子类别属性)。正常形式的信任()

    无论如何:
    永远不要忘记,在大多数情况下,使用大量的列而不是表之间的关系是个坏主意。(反模式3:)

    取决于要在该表上运行的查询。由于类别和子类别具有相同的列,请发布使用此表的最相关查询(可能有两种变体供您选择),将它们放在同一个表中并进行自联接不是更好吗?为什么这不是关系型的呢?因为正常形式()。例如:如果有一天你必须向你的子类别中添加一个子类型:你必须添加一个基本为空的列,并且小心地使用一个规则,即任何类别都不会有子类别(因为它只能是子类别属性)。信任正常形式。完整地说:永远不要忘记,在大多数情况下,用大量的列代替表之间的关系是个坏主意。(反模式3:)用这些评论编辑了我的帖子。
    | id | name          | parentId |
    |----|---------------|----------|
    | 1  | Category 1    |          |
    | 2  | Category 2    |          |
    | 3  | Category 3    |          |
    | 4  | Subcategory 1 | 1        |
    | 5  | Subcategory 2 | 2        |
    | 6  | Subcategory 3 | 3        |
    
    
    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));