AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 281192
Accepted
S-Man
S-Man
Asked: 2020-12-10 06:50:21 +0800 CST2020-12-10 06:50:21 +0800 CST 2020-12-10 06:50:21 +0800 CST

在为一对多关系选择哪种结构表设计时

  • 772

我面临一个问题。我必须设计一个数据库模式表结构。通常,我有一个具有一对多关系的小型分层树结构:

A 
|-B1
|  |-C1
|  |-C2
|
|-B2
   |-C3
   |-C4

现在,从我的角度来看,我有两个选择来设计这个:

  1. 对于 A 和 B,我可以创建两个表,而直接通过外键table_a引用。table_a我认为,这可能是更好的方法,因为您将需要更少的查询连接操作。

    CREATE TABLE table_a (
        id int PRIMARY KEY,
        some_specific_data text
    );
    
    CREATE TABLE table_b (
        id int PRIMARY KEY,
        some_other_specific_data text,
        id_parent int REFERENCES table_a(id)
    );
    
  2. 对于 A 和 BI 可以创建两个独立的表和一个连接两个表的附加关系表(就像我对多对多关系所做的那样)。在这里,两个表都更加独立,我认为这通常是可取的。

    CREATE TABLE table_a (
        id int PRIMARY KEY,
        some_specific_data text
    );
    
    CREATE TABLE table_b (
        id int PRIMARY KEY,
        some_other_specific_data text
    );
    
    CREATE TABLE a_to_b (
        id int PRIMARY KEY,
        id_a int REFERENCES table_a(id),
        id_b int REFERENCES table_b(id)
    );
    

在我看来,两者都是有效的设计。但是,我无法决定应该选择哪一个。选择选项 1 或选项 2 甚至第三个选项是否有任何论据?

编辑:

更加具体:

A 和 B 不是同一类型。你可以把它想象成:

  • A是房子
  • B是门
  • 所以,房子有很多门
  • 一扇门被一所房子所包含
database-design postgresql
  • 2 2 个回答
  • 80 Views

2 个回答

  • Voted
  1. J.D.
    2020-12-10T08:00:34+08:002020-12-10T08:00:34+08:00

    我认为有些困惑在于您如何标记事物。对象 A 和对象 B 与表 A 和表 B 不同,因为正如 bbaird 所指出的,对象 A 和对象 B 是同一个对象(或数据库上下文中的实体)。

    根据我对您的问题描述的理解,您可以将您的数据视为实际的父母和孩子,以帮助概念化。父母可以进入一个表,而孩子可以进入一个单独的表,但它们具有足够接近的特征,因为两者都是人,并且可能应该住在同一个主表中。然后,您可以拥有第二个表,该表表示子项与其父项的直接关系。以这种方式考虑之后,您的第一个设计选择更有意义(这是父子关系数据集的一个非常常见的设计选择。)

    注意:上述答案是在 OP 更新他的问题之前。请参阅已接受的答案以获取进一步说明。

    • 2
  2. Best Answer
    Damir Sudarevic
    2020-12-10T09:08:46+08:002020-12-10T09:08:46+08:00

    D |-[0,*]----------[1]-| H

    每扇门都属于一所房子;
    对于每个房子:不止一扇门可能属于该房子。

    -- House H exists.
    --
    house {H}
       PK {H}
    
    
    -- Door D belongs to house H.
    --
    door {D, H}
      PK {D}
      FK {H} REFERENCES house {H}
    

    D |-[0,*]--------[0,1]-| H

    每扇门最多属于一所房子;
    对于每个房子:不止一扇门可能属于该房子。

    -- House H exists.
    --
    house {H}
       PK {H}
    
    
    -- Door D exists.
    --
    door {D}
      PK {D}
    
    
    -- Door D belongs to house H.
    --
    house_door {H, D}
            PK {D}
           FK1 {H} REFERENCES house {H}
           FK2 {D} REFERENCES door  {D}
    

    注意:

    D |-[1,*]----------[1]-| H

    每扇门都属于一所房子;
    对于每所房子:至少有一扇门属于那所房子。

    不是那么容易实现的。这可能看起来不错:

    -- Door D belongs to house H.
    --
    house_door {D, H}
            PK {D}
    
    
    -- House H exists.
    --
    CREATE VIEW house (H)
    AS
    SELECT DISTINCT H
    FROM house_door;
    

    但是,不可能从模型的其余部分对房屋进行 FK。


    All attributes (columns) NOT NULL
    
    PK = Primary Key
    FK = Foreign Key
    
    • 2

相关问题

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • 在数据仓库中实现多对多关系有哪些方法?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve