SQL Server中的NoSQL


28

这个问题与SQL和NoSQL之间的区别无关。我正在寻找一些目前对我来说实际上毫无意义的理由(可能是由于我缺乏理解或欣赏)。

我们从头开始使用MVC5,Entity Framework 6代码和SQL Server 2008开始了一个新项目。当架构师检查数据库架构时,声明应该删除所有外键和其他此类约束,因为这是“业务逻辑”,并且应该在应用程序代码的业务层中应用。

我的观点是,外键构成数据/引用完整性的一部分,并不能真正模仿业务逻辑。我将业务逻辑视为控制引用什么/何时/如何/为什么应用引用的过程和验证。我可以理解唯一的约束可以说是业务流程,但是对我而言,这只是逻辑的补充,并构成完整性的一部分。

第二个论点是目标是对数据采用NoSQL方法。我发现这确实是不寻常且不合常规的:考虑到使用SQL Server 2008,报告的需要,数据无法扩展到TB级以及缺乏对诸如Mongo,Raven等技术的考虑。

有人遇到过这种情况吗?为什么有人在为参考数据设计的SQL Server中采用NoSQL方法而不想要外键?


21
与您的系统架构师讨论其建议的理由。他有一个很好的理由(适用于您的具体情况)(这是我们不一定能猜出的原因,而不必确切知道您的应用程序由什么构成),或者他只是没有能力。
Arseni Mourzenko 2015年

23
我已经看到许多数据库都以类似的方式实现:没有FK,没有CHECK约束-每次这些数据库都是由对数据库体系结构,参照完整性等一无所知的经验不足的编码人员设计的。您的同事,而不是简单地假设他没有能力。
Arseni Mourzenko 2015年

5
我有点困惑;您提到使用Entity Framework(首先是代码)...并不意味着您创建了Objects(在C#的意义上),然后让Entity Framework处理构建数据库等效项,在这种情况下,尝试添加/删除FK等是试图超越实体框架的练习(有点像马克·吐温关于试图教猪唱歌的报价?)
2015年

2
太多的人声称自己是“建筑师”,但实际上没有编码或维护更大系统的经验。
布朗

2
相关:thedailywtf.com/articles/The-Mythical-Business-Layer。“如果您考虑一下,实际上软件应用程序中的每一行代码都是业务逻辑。” 这扩展到数据库。“但是,要记住,几乎所有应用程序的代码都将是业务逻辑,这同样重要,甚至还要更重要。这里已经有足够的工具;您的应用程序不需要通用层 ”(重点是我的)。建议这样做的人可能正在尝试将数据库变成这样的通用层。简而言之,他们很可能将流行语置于现实之上。
jpmc26,2015年

Answers:


74

当他查看数据库模式时,他说所有外键和其他此类约束都应删除,因为这是业务逻辑,应在业务层内应用。

那时他是个白痴,有一天您的代码库摘录可能会出现在The Daily WTF上。绝对正确的是,他的方法没有道理,坦率地说,他的解释也没有。

尝试向他解释引用完整性约束不是“业务逻辑”;它们是带有自身内置验证的正确性标准。 业务逻辑与您对数据的处理有关。完整性是关于确保数据本身没有损坏。如果那不起作用...很好,他负责。您可以按照他的计划并尝试减轻损失,或者开始寻找更好的工作场所。(或两者。)


17
我有一个略微外交的答案,试图找到建筑师这样做的一个(合理的)原因。经过清醒的思考,我开始接受这个答案。
Blrfl 2015年

7
糟糕,糟糕的架构尝试是在其他地方工作的原因吗?该死的,如果我坚持这种观点,我将永远无法在任何地方继续工作。
2015年

5
@Kzqai也从根本上误解了建筑师。这听起来像是指令595,是的,如果有人要强迫我用锤子将螺钉钉入一块木头,我会发现有人没有强迫我滥用工具来建造东西。

4
引用完整性是数据库理论中的核心主题,更不用说在现实世界中支持它的所有数据库。显然,安迪的同事在他的分析中是正确的,其他学术和专业领域都是100%错误的。提及《每日WTF》的奖励积分。

2
@AndyClark您应该退出此。原因是它是您公司核心中的核定时炸弹。当粪便撞击到呼吸机上只是时间问题。发生这种情况时,您会幸运地轮班工作72小时,在最坏的情况下,您会找工作...有收入的时候最好找工作。
ArT 2015年

2

我还没有创建外键的理由

- 乔尔·斯波斯基Joel Spolsky)

除了一揽子声明,值得承认的是,有充分的理由选择不使用唯一性或外键约束。大多数人都这样:

  • 性能。用原子事务进行完整性检查不是免费的。通常,数据库是架构扩展中最困难的部分。也许您已经在应用程序逻辑中进行了检查,而不希望增加性能。
  • 缺乏需要。也许您的数据很脏,您还可以。这在很大程度上取决于您在做什么。

另请参见外键有什么问题?


但是,这些与您提出问题的原因不符。

这是业务逻辑,应在业务层中应用。

这个原因有点奇怪。唯一性和其他完整性约束在很大程度上是ACID数据库的领域。您的应用程序代码无法达到SQLServer的原子性和完整性保证。如果您需要强大的数据完整性,则忽略数据库是愚蠢的。

第二个论点是,他们希望对数据存储采用NoSQL方法,因此不希望有这样的限制。

第二个原因不是真的。这是一个结论。尽管约束是正确性与性能之间的折衷,但NoSQL数据库偏向后者。


也许您的系统架构师会想到这些合理的原因,而您却听错了。也许他是个白痴。

在任何情况下,都有充分的理由(尽管不是普遍的)理由避免使用唯一性和外键约束。

PS:如果得出结论,您不需要外键,则使用关系数据库仍然可以。一般而言,关系数据库比NoSQL对应数据库更成熟。作为单个节点,它们甚至可以更快,并且可以在它们之上构建 NoSQL抽象。


12
我敢说乔尔不是一个白痴,但是恕我直言,在播客中一个机智的回答,没有任何解释,比任何白痴的声明都值得。
2015年

11
Joel是电子表格专家,而不是数据库专家,所以我认为他对标准关系数据库实践的无知是不足为奇的……Joel。:-)
埃里克·金

3
Joel在上下文中的实际报价是诸如LINQ之类的技术,为设置外键提供了理由。Joel不是数据库管理员,从搜索他的博客并成为长期读者以来,我从他身上找不到任何话题或试图就优化数据库,设计数据模型等提供建议。 ,但他现在不是,也从来没有-或声称是!-数据库或数据建模领域的专家。就像引用爱因斯坦关于复利-或就此而言,三明治。(XKCD参考,不客气。):)
BrianH

4
乔尔·斯波斯基(Joel Spolsky)以有力的,有争议的观点而闻名。看到FogBugz是用专有语言编写的 ; 依赖注入太复杂了 (顺便说一句,这是关闭之前关于Stackoverflow最具争议的答案XML数据库运行缓慢 ; 等
BlueRaja-Danny Pflughoeft 2015年

2
@BlueRaja:嗯... XML数据库慢,特别是与关系数据库相比。从什么时候开始引起争议或发表意见?
梅森惠勒2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.