在这种情况下,我应该将数据库分成两部分吗?
方案
当客户在Order
表中创建,编辑和保存订单时,网站所有者调用存储过程来更改Email
表中的表属性。
更新
Order表与Email表的唯一关系是userId(电子邮件表上的FK)。那么,如果WHILE客户下订单有什么后果,我同时在电子邮件表中添加一个可以为空的“CcAddressId”列。这个订单成功会出现问题吗?
问题:
答案 0 :(得分:2)
简短的回答不是将数据库分成两部分,因为您将失去外键强制执行的参照完整性,更不用说上面提到的其他问题了。 您需要做的是确定当您将数据插入Orders表时,SQL Server是否会为您的EMails表发出任何类型的锁。 您可以使用此作为起点进行实验并找出答案:
http://aboutsqlserver.com/2012/04/05/locking-in-microsoft-sql-server-part-13-schema-locks/
更改表将尝试发出与任何其他类型的锁不兼容的架构修改锁(SCH-M)。因此,如果正在更改的表上发生任何活动(我认为会因为外键约束被验证而存在),那么您的模式修改语句将被阻止很长时间。
这就是为什么在数据库没有负载很重的情况下运行模式更改语句会更好。