sql-server – 总是有一个整数列作为主键的缺点是什么?
在我正在处理赏罚的一个Web应用措施中,行使在Entity Framework ORM上界说的一些通用存储库抽象全部数据库操纵. 可是,为了对通用存储库举办简朴计划,全部涉及的表必需界说一个独一的整数(C#中的Int32,SQL中的int).到今朝为止,这一向是桌子的PK和IDENTITY. 外键行使频仍,它们引用这些整数列.它们是同等性和ORM天生导航属性所必须的. 应用措施层凡是执行以下操纵: >从表(*) – SELECT * FROM表加载初始数据 运营频率较低: >批量插入 – BULK INSERT …进入表后跟(*)全部数据加载(以检索天生的标识符) *全部小表都在应用措施级别缓存,险些全部SELECT都不会达到数据库.典范的模式是初始加载和很多INSERT,UPDATE和DELETE. 按照当前的应用措施行使环境,在任何表中到达100M记录的也许性很是小. 题目:从DBA的角度来看,有这个表计划限定我也许碰着的重大题目吗? [编辑] 在阅读了谜底(感激很好的反馈)和参考文章后,我认为我必需添加更多细节: >当前的应用措施细节 – 我没有提到当前的Web应用措施,由于我想相识该模子是否可以重用于其他应用措施.可是,我的非凡环境是一个从DWH中提取大量元数据的应用措施.源数据很是紊乱(以一种稀疏的方法非类型化,有一些纷歧致,在很多环境下没有天然标识符等),我的应用措施正在天生清楚的疏散实体.另外,表现很多天生的标识符(IDENTITY),以便用户可以将它们勤奋课务键.除了大局限的代码重构之外,这还解除了GUID的行使. >实体框架限定 – 应承多列PK,可是their values cannot be updated >伟大的选择查询 – 这险些不会产生,由于全部小的(<20-30K记录)表数据都在应用措施级别举办缓存.这使得编写应用措施代码时糊口变得越发坚苦(更难编写LINQ),但数据库受到更好的冲击: SELECT allcolumns FROM BigTable WHERE filter1 IN (val1,val2) AND filter2 IN (val11,val12) 全部其他必须值都是通过缓存查找(O(1))获取的,因此不会天生伟大的查询. SELECT allcolumns FROM BigTable WHERE PKId = value1 (全部过滤器和值都是整数) 办理要领除了特另外磁盘空间(以及内存行使和I / O)之外,添加IDENTITY列乃至对不必要它的表也没有任何侵害(表不必要IDENTITY列的表)是一个简朴的联络表,好比将用户映射到他/她的权限).我阻挡在2010年的博文中盲目地将它们添加到每个表中: > Bad habits to kick : putting an IDENTITY column on every table 但署理键确实具有有用的用例 – 请留意不要假设它们担保独一性(偶然为什么它们会被添加 – 它们不该该是独一标识行的独一要领).假如您必要行使ORM框架,而且您的ORM框架必要单列整数键,纵然在您的真实密钥不是整数,也不是单个列或两者都不是的环境下,请确保界说独一束缚/索引对付你真正的钥匙. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |