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

时间:2015-12-03 11:32:19

标签: 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 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 个答案:

答案 0 :(得分:1)

'客户' table是您的主要表格,应该与所有3个表格相关联,check_account',' savings_account'和' loan_account'。在这3个表中应该有一个cust_num列代表forign键。

因此,如果客户有储蓄账户和贷款账户,那么对于该客户,客户表中有2行,Saving_account&中有一行。 loan_account表。

客户的所有帐户信息都应该在has_account表中,其中cust_num是forign键,因此您可以通过加入客户& amp;来轻松查找客户信息及其帐户详细信息。 has_account表。

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

注意 - 如果您遵循良好的数据库设计,那么您应该只有一个名为' cust_account'其中的列应该像acc_num,acc_code,acc_name等,acc_type列应该使用有效值进行更新,例如' save',' loan'或者'检查'。 在您的表结构中,为所有3个帐户类型表提供了acc_type列,如果您对不同的帐户类型有不同的表,则无意义。如果您要将seprate表用于帐户类型,请移动此列,否则请使用一个包含acc_type列的表。

答案 1 :(得分:0)

不是一个完整的答案而且评论时间太长,但我想我会解释为什么你有三个单独的表格的一些理由:

  

"支票帐户没有利率"

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

  

贷款账户没有余额

同样,这是一项业务规则 - 但肯定贷款具有原则余额。

  

可以在多个帐户类型之间共享一个帐号...帐号必须是主键,在这种情况下,帐号不能跨帐户共享

解决这个问题的一种方法是使用account number , account type作为"逻辑"复合主键(请注意,在大多数数据库系统中,使用序列号作为" true"主键与实际记录信息无关。如果帐号由于某种原因发生变化怎么办? / p>

如果某个帐户类型的属性无法实际存储在" shared"数据模型,然后您可以将它们建模为子表:

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

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

答案 2 :(得分:0)

创建values.get<long long>()表,其中列数据之间具有帐户类型的父子关系。名为custReg的列将是PK。由于常见属性可以轻松放在单个表中。

可以创建具有不同属性的其他表格,然后在第一个孩子级别将其与他们的帐户ID相关联。

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