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

Mysql 创建与现有层次结构数据库的新关系,mysql,sql,database,hierarchy,Mysql,Sql,Database,Hierarchy,我不熟悉使用关系数据库,尤其是嵌套集层次结构。我有一个现有的银行层级结构,银行分行是银行的“叶子”。我在试图建立用户和银行之间的关系,以及同一用户和每个分行必须提供的账户类型之间的关系时遇到了困难。每个分行提供不同类型的账户,每个账户有不同级别的规范。(例如,一家分行可能只有一个级别的账户规范,但另一家分行可能有四个级别)。我有我在下面创建的表 期望的结果:最终,我只希望能够运行select语句来检索所选分支机构必须提供的所有帐户,直至其规范。我还想知道所选用户的帐户以及他们所连接的银行。 我不

我不熟悉使用关系数据库,尤其是嵌套集层次结构。我有一个现有的银行层级结构,银行分行是银行的“叶子”。我在试图建立用户和银行之间的关系,以及同一用户和每个分行必须提供的账户类型之间的关系时遇到了困难。每个分行提供不同类型的账户,每个账户有不同级别的规范。(例如,一家分行可能只有一个级别的账户规范,但另一家分行可能有四个级别)。我有我在下面创建的表

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

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

(银行)继承人表:

顶级-“全球银行”--> 二级-“全球银行东海岸” &&“西海岸全球银行”

我用以下数据创建了一个“分支”表:

 +---------+---------+---------+----------+---------+-----------+
| 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 |
我想跟踪每个分行的账户类型,因此我创建了一个“分行账户”表

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

2级科目表

+---------+---------+---------+------------------------+
| Id     |    name                 | account_type_id    |                          
|
+---------+---------+---------+-------------------------+
|     1 |        Free Checking     |       1 |                          
|
|     2 |        Business Checking |       1 |
3级科目表

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

请让我知道如何建立我的关系,以获得上述期望的结果

您希望在“Account\u Level2”表和“branch\u accounts”表之间有一个外键,该外键确定2级帐户是分支帐户的子帐户。然后,您还需要从“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;

请注意,尽量与您的命名标准保持一致。在使用camel case(branch\u成员中的userId)和snake case(branch\u accounts中的account\u类型)的数据库时,可能会遇到困难。您应该尽量保持表命名的一致性和列命名的一致性

谢谢大家!!成功了。我肯定会重命名这些表/列。为了检索具有用户名和分支机构名称的同一帐户层次结构,我是否只需要向该查询添加另一个联接?我的“分支机构成员资格”表已包含用户/分支机构关系,但不包含用户/分支机构/帐户类型(层次结构)。只需将branch_accounts“id”列添加到branch membership表中以使事情变得更简单,这样做有意义吗?我将创建一个新表,沿着“AccountXUser”行存储用户拥有的每个级别3帐户。如果用户123有一个小型企业支票帐户,则该表将包含一个userId为123、accountLvl3Id为1的行。然后,您可以查询此表并将其与其他帐户级别的表联接,以获取有关帐户的信息。从中,您可以发现用户123有一个小型企业支票帐户,这是一个企业支票帐户(来自帐户级别2表),这是一个支票帐户(来自帐户级别1表),属于分支机构1。此外,我不知道您数据库的确切使用情况,但您可能并不关心显式存储用户属于哪个分支。由于您已经需要一个表来存储用户拥有哪些级别3帐户,因此可以执行一系列联接来确定该用户帐户所属的分支。通过存储用户所属的分支以及他们的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;