gpt4 book ai didi

sql-server - MS SQL : What is more efficient? 使用联结表或将所有内容存储在 varchar 中?

转载 作者:行者123 更新时间:2023-12-04 03:08:17 25 4
gpt4 key购买 nike

我想回答一个简单的问题:

我们有一个成员表。每个成员都从事一项、多项或不从事一项运动。最初我们(开发人员)创建了一个[member] 表、一个[sports] 表和一个[member_sports] 表,就像我们总是完成。

但是我们这里的客户不喜欢这样,并希望将成员(member)进行的所有运动存储在一个 varchar 列中,并用特殊字符分隔。

如果:

1 is football
2 is tennis
3 is ping-pong
4 is swimming

我喜欢游泳和乒乓球,我最喜欢的运动将存储到 varchar 列中:

x3,x4

现在我们不想只是走到客户面前并声称他的系统不正确。我们想用证据来支持它,即从 [member_sports] 获取运动的操作比简单地将字段存储为 varchar 更有效。

是否有任何文件可以支持我们的主张?帮助!

最佳答案

询问您的客户是否关心存储准确信息1而不是随机字符串。

然后给他们设置一系列挑战。首先,确保体育信息在正确的“域”中。对于 member_sports表,即:

sport_id int not null
^
|--correct type

对于他们的“将所有内容存储在 varchar 列中”的解决方案,我猜你正在写一个 CHECK约束。正则表达式可能会在这里有所帮助,但在 SQL Server 中没有对正则表达式的 native 支持 - 因此您要么对其进行保护,要么调用 CLR 函数以确保只有实际的 int存储值。

接下来,我们不仅要确保域名正确,还要确保运动在您的系统中确实定义。对于 member_sports ,那就是:

CONSTRAINT FK_Member_Sports_Sports FOREIGN KEY (Sport_ID) references Sports (Sport_ID)

对于他们的“将所有内容存储在 varchar 列中”,我想这将是一个复杂得多的 CHECK使用 UDF 查询其他表的约束。这将是困惑和程序性的。另外,如果你想防止从 sports 中删除一行虽然它仍然被任何 member 引用,你说的是 sports 上的触发器必须查询 members 中每一行的表2`.

最后说一下,同一项运动为一个成员(member)多次录制是没有意义的。对于 member_sports ,即(如果不是 PK):

CONSTRAINT UQ_Member_Sports UNIQUE (Member_ID,Sport_ID)

对于他们的“将所有内容存储在 varchar 列中”,这是另一个从 CHECK 调用的可怕的程序 UDF。约束条件。

即使如果 varchar变体表现得更好(不太可能,因为你需要将字符串分开并且 T-SQL 的字符串操作函数非常弱(见上面的回复:正则表达式))对于“表现更好”的某些值,他们如何建议数据是 有意义而不是废话?

编写也可以处理废话的程序变体是一项更具挑战性的工作。


如果上面的内容不清楚 - 我是声明性参照完整性 (DRI) 的忠实粉丝。说明你想要什么 与关注机制 是 SQL 吸引我的重要原因。您构建了正确的 DRI,并且知道您的数据始终是正确的(或者,至少,如您所期望的那样)


1“应用程序将始终正确执行此操作”不是一个好的答案。如果您设法构建了一个应用程序和相关数据库,其中没有人曾经编写一些直接的 SQL 来修复某事,我想您将是第一个。

但在大多数情况下,总是有多个应用程序,即使另一个应用程序是仅供开发人员使用的直接 SQL 客户端,您也无法相信该应用程序会始终正确运行。应用程序中的错误比 SQL 数据库引擎的约束实现中的错误更容易发生,后者的测试次数远远超过任何单个应用程序强制执行约束的尝试。


2更不用说更可能的查询了——查找与特定运动相关的所有成员。 member_sports 上的第二个索引使它成为一个简单的查询3。没有索引有助于“它位于此字符串中的某处”解决方案,并且您正在查看没有索引机会的表扫描。


3任何具有 sport_id 的索引首先应该能够满足这样的查询。

关于sql-server - MS SQL : What is more efficient? 使用联结表或将所有内容存储在 varchar 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47138375/

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