Oracle SQL:来自三个可能表的外键?

Oracle SQL:来自三个可能表的外键?,sql,oracle,Sql,Oracle,以以下场景为例: CREATE TABLE customers ( cust_num INTEGER PRIMARY KEY, cust_name VARCHAR(60) NOT NULL, //other info ); CREATE TABLE checking_account ( acc_num NUMBER(16) NOT NULL, acc_type VARCHAR(8) NOT NULL, //other info ); CREATE TABLE savi

以以下场景为例:

CREATE TABLE customers (
  cust_num INTEGER PRIMARY KEY,
  cust_name VARCHAR(60) NOT NULL,
  //other info
);

CREATE TABLE checking_account (
  acc_num NUMBER(16) NOT NULL,
  acc_type VARCHAR(8) NOT NULL,
  //other info
);

CREATE TABLE savings_account (
  acc_num NUMBER(16) NOT NULL,
  acc_type VARCHAR(8) NOT NULL,
  //other info
);

CREATE TABLE loan_account (
  acc_num NUMBER(16) NOT NULL,
  acc_type VARCHAR(8) NOT NULL,
  //other info
);

CREATE TABLE has_account (
  acc_num NUMBER(16) NOT NULL,
  acc_type VARCHAR(8) NOT NULL,
  cust_num INTEGER
);
多个客户可能拥有相同的帐户,此外,一个客户可能拥有多个帐户。has_account表中的帐号可能是唯一的,也可能不是唯一的


这是如何体现的?我曾尝试实现类表继承和具体继承,但我不知道如何允许一个帐号在多个帐号之间共享。我还没有找到一个例子或解释来考虑这个问题。有谁能告诉我如何实现这个功能,或者至少给我指出正确的方向?非常感谢您的帮助。

客户表是您的主表,它应该与所有3个表“支票账户”、“储蓄账户”和“贷款账户”链接。在这3个表中,应该有一列cust num,它将代表forign key

所以,若客户有储蓄账户和贷款账户,那个么对于该客户,客户表中有两行,储蓄账户和贷款账户表中有一行

客户所有账户信息应位于客户编号为forign key的has_账户表中,以便您可以通过加入客户和has_账户表轻松找到客户信息及其账户详细信息

如果您想知道一个客户有多少个帐户,请在customers表中使用count(cust_num)

注意-如果您遵循良好的数据库设计,那么您应该只有一个名为“cust_account”的表,其中的列应为acc_num、acc_code、acc_name等,acc_type列应使用有效值更新,如“SAVEN”、“loan”或“checking”。
在您的表结构中,所有3个帐户类型表都给出了acc_类型列,如果您对不同的帐户类型有不同的表,则没有意义。如果您要对帐户类型使用seprate表,请删除此列,否则请使用一个acc_类型列的表。

不是完整答案,注释太长,但我认为我会请说明为什么有三个单独的表:

“支票账户没有利率”

这是一个业务规则,不应该由不同的表结构实现。此外,在利率较高的时候,支票账户赚取利息当然是合理的。业务规则通常更容易更改数据结构

贷款账户没有余额

同样,这是一条商业规则——但贷款肯定有一个原则平衡

一个帐号可以跨多个帐号类型共享。。。帐号需要是主键,在这种情况下,它不能跨帐户共享

解决这一问题的一种方法是使用
帐号、帐号类型
作为“逻辑”复合主键(请注意,在大多数数据库系统中,使用序列号作为独立于实际记录信息的“真实”主键是有好处的。如果帐号因某种原因发生更改,该怎么办

如果某个帐户类型的属性无法切实存储在“共享”数据模型中,则可以将其建模为子表:

                       |- 0:1 -- 0:1 CheckingAccount    
Customer 1--* Account -|- 0:1 -- 0:1 SavingsAccount
                       |- 0:1 -- 0:1 LoanAccount

但您可能会发现,您最终会遇到类似的问题,使用分离数据结构的业务规则更容易解决。

创建列数据之间具有帐户类型父子关系的
custReg
表。名为
accountID
的列将是PK。因为公共属性可以轻松放置在一张桌子

可以创建更多具有不同属性的表,并随后在第一个子级别与它们的帐户ID链接


然后使用分层查询访问表之间的数据。

为什么不同账户类型有不同的表?有一个公共表,带有账户类型列。因为,例如,贷款账户没有余额,支票账户没有利率。我没有在我的原始帖子中包括此信息,因为我觉得这是不必要的,而且在scanario中,帐号需要是主键,在这种情况下,它不能在account之间共享。我仍然坚持使用一个表。这些列的值为NULL。(以及确保一切正常的约束。)对于每种帐户类型,您可能都应该有一个单独的连接表。我对您所说的在customers表中添加2行感到困惑。您是否建议在customers表中添加额外的列?如果任何客户都有贷款帐户和储蓄帐户,那么customer表中该客户有2个条目,并且应该有单独的e在loan_account和saving_account表中分别为loan_account和saving_account设置ntry。为了避免现实世界中的比较,我的主要观点是,三个表中的每个表都有特定于该表的列。这意味着将三个表合并到一个大表中会导致大量空数据。更重要的是,它确实存在不允许在多个用户之间共享帐号accounts@Briscoooe我理解这一点,但是您需要考虑什么是“需求”在业务规则和数据结构中最佳地实现。数据结构更难更改,并且应该被设计成允许实用的灵活性。“永不”。在数据结构中比在业务规则中“从不”更持久。听起来这是一个实验(你可能没有“业务规则”作为它的一部分),而不是“真实世界”场景,但在“真实世界”中,这些事情非常重要。