我在我的项目中使用Spring Data和SQL Server作为angular webapp的后端,这是一个没有任何繁重算法的信息网站 - 大多数只是呈现CMS中准备的内容,我也开发了。
自从开始所有数据库结构都是用sql脚本手工创建的,作为一个简单的基本表,ID列上只有IDENTITY和主键(甚至在连接表时),然后通过Spring注释进行映射,以便按照预期提供服务,即表格为entites with生成值ids,连接具有级联功能的表,需要进行多对多关系,到目前为止一切运行良好。
我查看了我的sql脚本,目前我在考虑是否手动设置任何外键数据库服务器端实际上会以任何方式提供帮助(性能方面)或者更确切地说是一些现在不存在的问题,例如与SpringData DELETE操作发生冲突(只是猜测)?
当ORM框架在使用中有好的或坏的做法时,是否设置关系服务器端?如果我应该设置关系数据库服务器端,如果有任何故障安全规则,我应该记住这样做吗?
另外,在这种情况下,如何将连接表编入索引?如果我有表A和表B(两者都带有ID上的PK),并且在AB表上加入了多对多关系,并且将单向使用它(A是我的主要实体),那么只能索引AB.A_ID吗? / p>
答案 0 :(得分:1)
首先澄清一下:您正在谈论“Spring annotations”和“SpringData DELETE操作”。
用于映射的注释来自JPA,可能还有JPA实现(例如Hibernate)。 Spring Data JPA也只是委托给JPA,所以如果你正在研究映射相关的问题,你将需要看看JPA。
对于您的实际问题:
当我使用像[JPA]这样的ORM框架时,是否需要或建议在数据库服务器端标记关系?
需要的?否。
劝?这取决于,但可能是的。
外键确保数据库与外键定义的约束一致。特别是FK引用的记录实际上就存在了。当您同时运行多个事务时,这在客户端很难正确实现。
当然,这需要付出代价。
每当您更改数据时,数据库都必须检查约束。
某些操作必须按正确的顺序进行。例如,您必须在引用之前插入记录。 JPA通常会为您处理此事。
我不希望在引入FK时出现任何与JPA相关的问题。您可能真正想知道的任何可能出现的问题。
在这种情况下如何将联接表编入索引?
以下是基于我的知识或Oracle,但我认为它与其他数据库非常相似。 默认情况下,应为任何FK列编制索引。这样做的原因是DB需要确保一致性,为此,它需要查找和锁定引用给定记录的行。如果没有索引查找,这些行将导致表扫描,并且锁定将在表级而不是行级发生。
我正在考虑手动设置任何外键数据库服务器端是否实际上有任何帮助(性能方面)
您可能会在两个方向上看到效果效果。
维护约束需要一些工作,并且可能会使DML语句变慢。
另一方面,DB实际上可能会使用这样的知识:它将为外键找到恰好一行来创建更好的执行计划。此外,索引通常也会用于其他查询。
如果要在系统中加载大量数据,可以考虑禁用约束,但听起来并不像是在使用该用例。
最后一点说明:
Spring Data实际上是基于DDD的思想,特别是Aggregates。如果你接受这个想法,你不应该在不同的聚合体之间有FK,因为那些只是为了最终是一致的。但这是一个很大的话题,超出了这个问题的范围。如果您有兴趣,请介意this article series interesting。