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

问题描述:

我在2个不同的数据库中创建了2个表。第一个数据库名称是包含userDetails表的用户,它具有id作为主键和user_name,而我的第二个数据库是具有1个称为customerDetails的表的客户,其具有1个作为主键和客户名称的一个表以及一个以上的视图用户表中包含该用户表和名称的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最后一列从视图的外键。我怎样才能做到这一点?

+0

'FOREIGN KEYS'用于限制您可以插入表格列的内容。我想你正在寻找的是一个'JOIN',它用于从两个表中获取数据,并将它们连接在一起。 – Fredster

+0

“视图”预先准备好了不影响“FOREIGN KEYS”的SELECT语句。 – Fredster

+0

是的,我想从userDetails表中的数据,但它存在于另一个数据库称为用户,所以要访问它在客户数据库我创建该userDetails表的视图在这里,我如何使用id的userDetails表作为外键在我的customerDetails表中? –

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

连接表是多对多的,并将用户和公司连接在一起。

模式:

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 

记住用户和公司是独立的实体和接口两种需要的东西捆绑在一起。联结表是一个很棒的地方,可以放置一列,如effectiveRights或其他东西。它会表示用户可以做什么,如插入,更新,删除,查看,黑名单等。

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