数据库设计 – 使用逗号分隔的多个外键是错误的,如果是,为什么?
有两个表:Deal和DealCategories.一笔交易可以有很多交易类别.
所以正确的方法应该是使用以下结构制作一个名为DealCategories的表: DealCategoryId (PK) DealId (FK) DealCategoryId (FK) 但是,我们的外包团队以这种方式将多个类别存储在Deal表中: DealId (PK) DealCategory -- In here they store multiple deal ids separated by commas like this: 18,25,32. 我觉得他们所做的是错的,但我不知道如何清楚地解释为什么这是不对的. 我该如何向他们解释这是错的?或者也许我是那个错了,这是可以接受的? 解决方法是的,这是一个糟糕的主意.而不是去: SELECT Deal.Name,DealCategory.Name FROM Deal INNER JOIN DealCategories ON Deal.DealID = DealCategories.DealID INNER JOIN DealCategory ON DealCategories.DealCategoryID = DealCategory.DealCategoryID WHERE Deal.DealID = 1234 你现在必须去: SELECT Deal.ID,Deal.Name,DealCategories FROM Deal WHERE Deal.DealID = 1234 然后,您需要在应用程序代码中执行操作,将该逗号列表拆分为单个数字,然后单独查询数据库: SELECT DealCategory.Name FROM DealCategory WHERE DealCategory.DealCategoryID IN (<<that list from before>>) 这种设计反模式源于对关系建模的完全误解(你不必害怕表格.表格是你的朋友.使用它们),或者一种奇怪的错误信念,以逗号分隔的列表并拆分它会更快在应用程序代码中,而不是添加链接表(它永远不会).第三种选择是他们对SQL没有足够的信心/能力来设置外键,但如果是这样的话,他们就不应该与关系模型的设计有任何关系. SQL Antipatterns(Karwin,2010)将整整一章用于这个反模式(他称之为’Jaywalking’),第15-23页.此外,作者已在similar question over at SO发布.他指出的关键点(适用于此示例)是: >查询特定类别中的所有交易相当复杂(解决该问题的最简单方法是正则表达式,但正则表达式本身就是一个问题). TLDR:这是一个根本上有缺陷的设计,它不能很好地扩展,它甚至可以为最简单的查询带来额外的复杂性,并且开箱即用会降低您的应用程序速度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |