与现有层次结构数据库创建新关系

creating new relationships with existing hierarchy database

我不熟悉关系数据库,尤其是嵌套集层次结构。我有一个现有的银行层次结构,其中银行分行作为银行的 "leaves"。我在尝试建立用户与银行之间的关系以及同一用户与每个分支机构必须提供的帐户类型之间的关系时遇到了困难。每个分支机构提供不同类型的帐户,每个帐户都有不同级别的规范。 (例如,一个分支机构可能只有一个级别的帐户规范,而另一个分支机构可能有四个级别)。我在下面创建了 tables。

期望的结果:最终,我只想能够 运行 一条 select 语句来检索所选分支机构必须提供的所有帐户,以满足其规范。我还想知道所选用户拥有什么帐户以及他们连接的银行。

我不想将帐户级别的数据添加到现有的银行层次结构中,因为我觉得这会使事情变得更加复杂。 (我的银行分行将来可能会有自己的假期)。我在下面缺少什么?

(银行)Heirachy Table:

顶级 -"Global Bank"---> 2 级-"Global Bank-East Coast" && "Global Bank-West Coast"

我用以下数据创建了一个 "Branch" Table:

 +---------+---------+---------+----------+---------+-----------+
| Id     |    name     | address 1     | telephone   | city     |                         
|
+---------+---------+---------+----------+---------+------------+
|     1 |GB-New York   |       East ST |212-555-9999 |   NY     |                           
|
|     2 |GB-California |       West ST |619-555-5555 |   CAL    |                  

然后我创建了一个 "branch membership" table,其中包含用户 ID 和用户拥有帐户的分支机构。

 +---------+---------+---------+--------
| Id     |    userId     | branchId    |                          
|
+---------+---------+---------+---------
|     1 |        123 |       1 |                          
|
|     2 |        123 |       2 |

我想跟踪每个分行的账户类型,所以我创建了一个 "branch_accounts" table

 +---------+---------+---------+----------+--+
| Id     |    account_type    | branch_id   |                         
|
+---------+---------+---------+------+
|     1 |Checkings        |       1 |                         
|     2 |Savings          |       1 |
|     3 |401K             |       2 |  

这里是事情变得复杂的地方。我为每个级别的帐户类型创建了 tables。例如,支票账户可以是免费支票账户,但免费支票账户可以是学生账户,也可以不是。业务检查可能适用于小型企业或大型企业等。所有账户类型最多有 3 个特定级别。

Account_Level 2 Tables

+---------+---------+---------+------------------------+
| Id     |    name                 | account_type_id    |                          
|
+---------+---------+---------+-------------------------+
|     1 |        Free Checking     |       1 |                          
|
|     2 |        Business Checking |       1 |

Account_Level 3 table

+---------+---------+---------+------------------------+
| Id     |    name                 | account_lvl2_ID    |                          
|
+---------+---------+---------+-------------------------+
|     1 |        Small Business Checking     |       2 |                          
|
|     2 |        Big Business Checking       |       2 |

请告诉我如何建立我的关系以获得上述期望的结果。

您想要从 "Account_Level2" table 到 "branch_accounts" table 的外键,它确定 2 级帐户是 sub-account 的分支帐户。然后,您还需要从 "Account_Level3" table 到 "Account_Level2" table 的类似外键,确定每个 3 级帐户与哪个 2 级帐户相关联。

有了这个结构,在你的(假定的)其他 table 中存储了每个成员拥有的帐户,它将有一个指向你的帐户级别 3 table 的外键,从而提供有关整个帐户层次结构。

有了这个新层次结构,您将能够像这样执行您选择的查询

SELECT Branch.Id AS branch_id,
       Branch.name AS branch_name,
       account_type,
       Account_Level2.name AS account_level_2_name,
       Account_Level3.name AS account_level_3_name
FROM Branch JOIN branch_accounts 
     ON Branch.Id = branch_accounts.branchId
JOIN Account_Level2 
     ON branch_accounts.id = Account_Level2.account_type_id
JOIN Account_Level3 
     ON Account_Level2.id = Account_Level3.account_lvl2_ID;

快 side-note,尽量与您的命名标准保持一致。使用驼峰式大小写(branch_membership 中的 userId)和蛇形大小写(branch_accounts 中的 account_type)的数据库可能会很困难。您应该尽量保持 table 命名一致,并保持列命名一致。 Here's a helpful link on MySQL "naming conventions" (really just suggestions, but still good to follow).