我在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最后一列中的最后一个表中作为外键来自视图。我怎样才能实现这一目标?
答案 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。