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