我想要两个模型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,例如:
你会如何推荐一个sql新手呢? :)
我认为我建模的方式是一对多......
答案 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)账户的关联。但是,要完全理解为什么这是最常用的方法,我建议您阅读有关规范化的内容。