视图和表之间的主键和外键映射

时间:2016-07-15 09:20:10

标签: mysql sql database

我在2个不同的数据库中创建了2个表。第一个数据库名称是user,其中包含userDetails表,其id为主键和user_name,我的第二个数据库是customer,其中有1个表称为customerDetails,其中1个id作为主键,客户名称和上面的一个视图用户表,其中包含该用户表和名称的ID。

所以我想做的是,在customerDetails表中创建该视图的外键,以便我可以通过视图从客户数据库访问用户表。我不知道如何实现这一目标,因为我是数据库概念的新手,所以任何人都可以帮助我解决这个问题。

整个场景如下,

> Database Name : user 
> Table Name    : userDetails 
> Fields        : id   userName
> 
> Database Name : customer 
> View Name     : user_view
> Fields        : id  userName
> 
> Database Name : customer 
> View Name     : customerDetails 
> Fields        : id     custName

我希望在customerDetails最后一列中的最后一个表中作为外键来自视图。我怎样才能实现这一目标?

1 个答案:

答案 0 :(得分:1)

与外键相关的视图与您的同行在评论中提到的数据一样。下面使用连接表来交叉用户和公司,在数据库之间强制执行外键约束(对数据库之间的共享信息不是一个坏主意)。

Junction Table是多对多的,它将用户和公司联系在一起。

<强>架构:

create schema userDB;
create table userDB.userDetails
(   id int auto_increment primary key,
    userName varchar(100) not null
);

create schema customerDB;
create table customerDB.customerDetails
(   id int auto_increment primary key,
    custName varchar(100) not null
);

create table customerDB.userCustomerJunction
(   -- a many-to-many mapping
    id int auto_increment primary key,
    userId int not null,
    custId int not null,
    unique key (userId,custId), -- no dupes allowed
    foreign key `ucj_2_user` (userId) references userDB.userDetails(id),
    foreign key `ucj_2_cust` (custId) references customerDb.customerDetails(id)
);

测试一下:

insert customerDB.customerDetails(custName) values ('Exxon Mobil'); -- id 1
insert customerDB.userCustomerJunction(userId,custId) values (1,7); -- FK Failure
-- above line generates an error 1452 as expected
insert userDB.userDetails(userName) values ('Kelly'); -- id 1
insert customerDB.userCustomerJunction(userId,custId) values (1,1); -- success, FK's satisfied

请记住,用户和公司是独立的实体,并且要将两者联系在一起需要将它们联系在一起。 Junction表是放置诸如effectiveRights之类的列的绝佳位置。它表示用户可以执行的操作,例如插入,更新,删除,查看,黑名单等。

在用户和公司之间创建视图就像任何连接一样,但在这种情况下,它将位于表名前面带有whichDB.的数据库之间。视图具体化并体现在物理表中。因此,作为物理规则,物理具有FK的有效性(数据完整性)。添加effectiveRights列将帮助您确定每个用户和公司可以一起执行的操作:例如,是的,此用户对此公司信息具有某些权限等。使用权限位标记或单独的列对于权利,所有在Junction表中。有关连接表的示例,请参阅我的Answer