与现有层次结构数据库

时间:2018-03-17 05:29:38

标签: mysql sql database hierarchy

我是处理关系数据库,尤其是嵌套集层次结构的新手。我有一个现有的银行分行,银行分行为"离开"银行我试图建立用户和银行之间的关系以及同一用户与每个分支机构必须提供的帐户类型之间的关系。每个分支都提供不同类型的帐户,每个帐户都有不同的规范级别。 (例如,一个分支可能只有一个级别的帐户规范,而另一个分支可能有四个级别)。我有我在下面创建的表格。

渴望的结果:最后,我只想运行一个select语句来检索所选分支必须提供的所有帐户,直到它的规范。我还想知道所选用户的帐户以及他们所连接的银行。

我不想将帐户级别数据添加到现有的银行层次结构中,因为我觉得这会使事情进一步复杂化。 (我的银行分行最终可能会有自己的叶子)。我在下面缺少什么?

(银行)Heirachy表:

顶级 - "全球银行" ---> 2级 - "全球银行 - 东海岸" &安培;&安培; "全球银行 - 西海岸"

我创建了一个"分支"表格包含以下数据:

 +---------+---------+---------+----------+---------+-----------+
| 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    |                  

然后我创建了一个"分支会员资格"包含userId的表以及用户拥有帐户的分支。

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

我想跟踪每个分支的帐户类型,因此我创建了一个" branch_accounts"表

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

这是事情变得复杂的地方。我为每个级别的帐户类型创建了表格。例如,支票帐户可以是免费支票帐户,但免费支票帐户可以是学生帐户。商业检查可以针对小型企业或大型企业......等。所有帐户类型最多包含3个特定级别。

Account_Level 2表

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

Account_Level 3表

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

请让我知道如何建立我的关系以获得上述所需的结果。

1 个答案:

答案 0 :(得分:1)

您希望拥有来自" Account_Level2"的外键。表格到你的" branch_accounts" table,用于确定二级帐户是分支帐户的子帐户。然后,您还需要来自" Account_Level3"的类似外键。表到你的" Account_Level2"表,确定每个3级账户与哪个2级账户相关联。

使用此结构,在您的(假定的)其他表中存储每个成员拥有的帐户,该表将具有您的帐户级别3表的外键,从而提供有关整个帐户层次结构的信息。

使用这种新的层次结构,您将能够像这样执行所选的查询

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;

快速注意事项,尽量保持与您的命名标准保持一致。使用驼峰案例(branchImembership中的userId)和snake案例(branch_accounts中的account_type)使用数据库可能会很困难。您应该尝试保持表命名一致并保持列命名一致。 Here's a helpful link on MySQL "naming conventions" (really just suggestions, but still good to follow)