gpt4 book ai didi

sql - 1 对多关系限制 1 对 3 的数据库设计效率

转载 作者:行者123 更新时间:2023-12-04 21:54:46 25 4
gpt4 key购买 nike

这是在mysql中,但它是一个数据库设计问题。如果您有一对多的关系,例如银行客户与银行账户之间的关系,通常情况下,记录银行账户信息的表会有一个外键,用于跟踪账户和客户之间的关系。现在这遵循第三范式,并且是一种被广泛接受的做法。

现在假设您要将用户限制为只有 3 个帐户。当前的数据库实现将支持这一点,无需更改。但是另一种方法是在帐户表中有 3 列,其中包含 3 个相应帐户的 ID。顺便说一句,这违反了数据库设计的第一范式。

问题是,与传统方式相比,以这种方式记录用户帐户关系的优缺点是什么?

更新

不幸的是,我不负责数据库设计。当我看到在我们的数据库中实现了类似的关系时,我问我的老板,数据库设计师,为什么他选择这样做。我并没有真正得到一个严格的答案,或者一个我认为有逻辑理由支持它的答案。 “当您使用数据库分配时,这是一种非常常见的关系,这就是您的工作方式。”我要求更多说明。 ......没有让我到任何地方,让他防守。

非常感谢大家的这些帖子,我真的找不到任何书甚至谈到做这样的事情。我发现很多书都告诉我要以正确的方式去做,但没有多少书能举出这个坏掉的例子,然后解释为什么它会很糟糕。

最佳答案

最大的问题是您的查询变得更加复杂。假设您要查找所有者余额超过 10,000 美元的所有帐户。在规范化的数据库中,这将类似于:

select firstname, lastname, accountnumber, balance
from account
join customeraccount using (accountnumber)
join customer using (customernumber)
where balance>10000

但是有了三个帐号字段,它就变成了
select firstname, latname, accountnumber, balance
from account
join customer on customer.accountnumber1=account.accountnumber
or customer.accountnumber2=account.accountnumber
or customer.accountnumber3=account.accountnumber
where balance>10000

将 Account 连接到 Customer 的每个查询现在都变得更加复杂。

迟早有人会写一个查询没有检查 accountnumber3,或者他试图通过复制和粘贴来进行三个测试,并且在复制 accountnumber1 两次后他忘记更改其中一个。这是一个在阅读查询时很容易忽略的错误。如果您搞砸了三个比较中的一个,该程序将适用于所有只有两个帐户的客户,但对于拥有三个帐户的客户则失败。这是一种很容易在测试中溜走的问题。

您现在必须仔细考虑当同一客户有多个帐户时联接的工作方式。如果客户在某个查询中有两个符合条件的帐户,您希望他出现一次还是两次?

您可能需要索引 customer 中的帐号字段。现在您需要三个索引而不是一个。更多的数据库开销。

您确定最大值永远不会改变吗?因为如果有的话,现在检查三个插槽的每个查询都必须更改为检查四个插槽。这可能是大量的工作。

你得到什么来换取所有这些痛苦?自动执行 max-3 限制。少一张 table 。您可能会在某些查询上获得更好的性能,因为要连接的表少了一个。再说一次,您可能无法获得更好的性能,这取决于数据库引擎内部工作的许多细节和实际数据。

总而言之,我会说这几乎肯定不值得做。坚持使用规范化的数据库。

我根据经验说话。我曾经做过与此非常相似的事情。我们有一个数据库,我们必须为我们组织出版的每本书记录三种类型的“经理”(#1 负责预算和管理,#2 负责发行,#3 负责内容(即编辑) 。由于这三个不同,我创建了三个单独的点。巨大的错误。我会更好地创建一个带有类型代码的 book-manager 表,并且只使用触发器或代码强制执行每种类型中的一个。查询将有变得更简单了。(经验使您能够做出正确的决定。通过做出错误的决定可以获得经验。)

关于sql - 1 对多关系限制 1 对 3 的数据库设计效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3047063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com