许多人

时间:2018-01-31 22:40:29

标签: mysql sql many-to-many

我想要两个模型2简单表:帐户&管理器。

帐户可以有多个经理,经理可以拥有多个帐户来管理。所以我们之间有多对多的关系。

这是我在db中创建它们的方式:

CREATE TABLE Account (
    accountId int NOT NULL AUTO_INCREMENT,
    name varchar(255) NOT NULL,
    PRIMARY KEY (accountId)
);

CREATE TABLE Manager (
    managerId int NOT NULL AUTO_INCREMENT,
    name varchar(255) NOT NULL,
    accountId int NOT NULL,
    PRIMARY KEY (managerId),
    FOREIGN KEY (accountId) REFERENCES Account (accountId)
);

对你来说可能很明显的问题是,我会为同一位经理提供重复的名称和不同的ID,例如:

enter image description here

你会如何推荐一个sql新手呢? :)

我认为我建模的方式是一对多......

4 个答案:

答案 0 :(得分:0)

创建映射表(Egs Account_Manager)到Map帐户,Manager和AccountID和ManagerID应该是外键。

此致 阿都

答案 1 :(得分:0)

我将从管理器中删除accountid / foreign键并引入一个新表来交叉引用这两个表。像这样:

CREATE TABLE ManagerAccount(
    id int not null auto_increment,
    managerId int not null,
    accountId int not null,
    primary key(id),
    foreign key(managerid) references Manager (ManagerID),
    foreign key(accountId) references Account (AccountID)
)

也许在两个外键上抛出一个唯一索引。

答案 2 :(得分:0)

与第三个表实现多对多关系,并使用两个相关表的外键。

举个例子:

person
  id
  person_name

club
  id
  club_name

俱乐部可以有零个,一个或多个成员;一个人可以是零,一个或多个俱乐部的成员。这是一种多对多的关系。

关系表的最简单形式:

membership
   club_id       PK, FK ref club.id
   person_id     PK, FK ref person.id

可以定义......

CREATE TABLE membership
( club_id    INT NOT NULL COMMENT 'PK, FK ref club.id'
, person_id  INT NOT NULL COMMENT 'PK, FK ref person.id'
, PRIMARY KEY (club_id, person_id)
, KEY membership_IX1 (person_id)
, CONSTRAINT FK_membership_club   FOREIGN KEY (club_id)   REFERENCES club (id)
, CONSTRAINT FK_membership_person FOREIGN KEY (person_id) REFERENCES person (id)
)

我们注意到此关系本身可能具有属性,例如加入日期和日期已重新签名。可能还有状态(临时,主动,试用),我们可能希望跟踪俱乐部内的办公室或角色。

这种关系可能不仅仅是一个联结链接表。它实际上可能是我们系统中的一个实体。我们可能希望像实体一样处理它,添加一个单独的id列,并考虑删除(club_id,person_id)唯一的要求。

答案 3 :(得分:0)

通常,建立多对多关系的最佳方式是创建一个单独的表来保存它。使用您的示例:

CREATE TABLE Account (
   accountId int NOT NULL AUTO_INCREMENT,
   name varchar(255) NOT NULL,
   PRIMARY KEY (accountId)
);

CREATE TABLE Manager (
    managerId int NOT NULL AUTO_INCREMENT,
    name varchar(255) NOT NULL,
    PRIMARY KEY (managerId),
);

CREATE TABLE Account_Manager (
        id int NOT NULL AUTO_INCREMENT,
        accountId int NOT NULL,
        managerId int NOT NULL,
        PRIMARY KEY (id),
        FOREIGN KEY (accountId) REFERENCES Account(accountId)
        FOREIGN KEY (managerId) REFERENCES Manager(managerId)
 );

这样,经理和账户之间的任何关联都将出现在Account_Manager表中(例如(5,1)表示帕特里克与accountId = 5)账户的关联。但是,要完全理解为什么这是最常用的方法,我建议您阅读有关规范化的内容。