我有一个关于代理键的问题,比如我有两个表(在sql server中):
表A: Student_ID,名称,学校,科
表B: Book_ID、Student_ID、IssueDate、BookName
如果Student_ID是一个群集代理项,并且名称是非聚集索引。如何在不知道Student_ID的情况下手动将数据输入表B,我知道我可能需要在表A中进行查找才能找到ID,但这样做并不有效。有什么办法让这件事更有效率吗?在考虑插入时,我试图考虑代孕密钥本质上是如何以外键的效率来工作的。
发布于 2017-01-19 20:05:36
假设Student_ID是一个身份
INSERT INTO [student] ([name]) VALUES ('penny');
declare @studentID int = (select @@IDENTITY);
insert into studentBood (studentID, bookID) values (@studentID, 1);
insert into [studentBook] ([studentID], [bookID])
select [student].[iden], 13
from [dbo].[student]
where name = 'penny';
select * from studentBook
select * from student发布于 2017-01-19 19:43:15
您可以在表B中而不是在Student_ID中添加学生的名字,但是这不会被规范化,而且您将复制数据,而且如果您没有约束,那么您可能会添加没有在表A中注册的学生。name列的字节肯定会比Student_ID多。查找将是有效的,因为您在表A中使用Student_ID作为聚集索引。如果按该列进行查询过滤,您的搜索将很快,SQL引擎将在执行计划中使用索引查找操作,即使表很小,SQL也会将整个表放入缓存(RAM)中,这样就不必从磁盘中读取。对于事务性应用程序,您的设计很好,对于数据仓库来说,您可以使用允许复制数据的非规范化设计。
https://dba.stackexchange.com/questions/161634
复制相似问题