"一个适当的"表,我不存储每列Mehrdad's answer to a related question.相反,您应该创建另一个表,有效地保存所述列表的元素,然后直接或通过连接表链接到它.然而,我想要创建的列表类型将由唯一的项组成(与链接问题的fruit个示例不同).此外,我的列表中的项目是显式排序的——这意味着如果我将这些元素存储在另一个表中,每次访问它们时,我都必须对它们进行排序.最后,这个列表基本上是原子的,因为每当我想要访问这个列表时,我都会想访问整个列表,而不仅仅是其中的一部分——因此,必须发出一个数据库查询来收集列表的各个部分似乎很愚蠢.

AKX的解决方案(见上图)是序列化列表并将其存储在二进制列中.但这似乎也不方便,因为这意味着我必须担心序列化和反序列化.

有更好的解决办法吗?如果没有更好的解决方案,那为什么?这个问题似乎应该不时出现.

... 再多给你一点信息,让你知道我来自哪里.当我刚刚开始理解SQL和数据库时,我就开始使用LINQ to SQL,所以现在我有点被宠坏了,因为我希望处理我的编程对象模型,而不必考虑对象是如何查询或存储在数据库中的.

谢谢大家!

约翰

更新:在我得到的第一批答案中,我看到了"你可以 Select CSV/XML路由……但不要!".所以现在我在寻找原因的解释.给我指一些好的参考资料.

另外,为了让您更好地了解我在做什么:在我的数据库中,我有一个函数表,其中包含(x,y)对的列表.(表中还有其他对我们的讨论没有影响的信息.)我永远不需要看到(x,y)对列表的一部分.相反,我会把它们全部拍下来,在屏幕上画出来.我将允许用户拖动 node ,偶尔更改值或向绘图中添加更多值.

推荐答案

不,没有"更好"的方法将一系列项目存储在一列中.关系数据库被设计为每行/列组合存储一个值.为了存储多个值,可以将列表序列化为单个值进行存储,然后在检索时对其进行反序列化.没有其他方法来做你所说的(因为你所说的是一个bad idea that should, in general, never be done).

我理解您认为创建另一个表来存储该列表是愚蠢的,但这正是关系数据库所做的.您正在进行一场艰苦的战斗,毫无理由地违反了关系数据库设计的最基本原则之一.既然你说你只是在学习SQL,我建议你避免这种 idea ,坚持使用经验丰富的SQL开发人员推荐给你的实践.

您违反的原则称为first normal form,这是数据库规范化的第一步.

数据库规范化是根据数据is定义数据库的过程,这样您就可以针对它编写合理、一致的查询,并能够轻松维护它,这可能会使事情变得过于简单.规范化旨在限制数据中的逻辑不一致和损坏,它有很多级别.维基百科上关于database normalization的文章实际上相当不错.

基本上,规范化的第一条规则(或形式)规定表必须表示一个关系.这意味着:

  • 您必须能够区分一行和任何其他行(换句话说,您的表必须有can作为主键.这也意味着不应重复任何行).
  • 数据的任何顺序都必须由数据来定义,而不是由行的物理顺序来定义(SQL基于集合的概念,这意味着您应该依赖的only个顺序是您在查询中明确定义的顺序)
  • Every row/column intersection must contain one and only one value

最后一点显然是这里的重点.SQL旨在为您存储集合,而不是为您提供一个"存储桶",供您自己存储集合.是的,这是可能的.不,世界不会结束.然而,通过立即使用ORM,您已经在理解SQL及其最佳实践方面陷入了困境.LINQ to SQL非常棒,就像图形计算器一样.然而,同样地,它们也应该被用作了解它们所采用的过程实际上是如何工作的替代品.

您的列表现在可能完全是"原子"的,这在这个项目中可能不会改变.但是,你会养成在其他项目中做类似事情的习惯,最终(可能很快)你会遇到这样一种情况:你现在正在适应快速n简单列中列表的方法,而这种方法是完全不合适的.在为您试图存储的内容创建正确的表方面,没有太多额外的工作,当其他SQL开发人员看到您的数据库设计时,您也不会受到嘲笑.此外,LINQ to SQL将看到您的关系,并为您的列表automatically提供适当的面向对象接口.你为什么要放弃ORM为你提供的便利,这样你就可以进行非标准的、不明智的数据库黑客攻击?

Sql相关问答推荐

SQL查询以条件空值跟踪生产操作结果进展

数据库索引:如何使用名称和类别对项目进行最佳索引?

BigQuery-当子查询不返回任何结果时,所有结果为零

SQL:如何取上一年的平均值?

最近3个月收到的邮箱总数

直接加法(1+1)与聚合函数SUM(1+1)的区别是什么

Select 列组(按同一表格中的另一列分组)Laravel 10

明细表中没有记录如何更新主表的值为0

根据时间、状态和相关行在PostgreSQL中的存在来删除行

SQL查询正在工作,但返回空结果

如何使用聚合连接两个表

为什么SQL in中的空子查询有时被视为null

SQL ORACLE - 查找连续天数

汇总具有连续日期范围的行

joins 组合多个重复数据删除策略

String_Split 多列

连续期间的缺口

如何将多行的查询结果合并为一行

从每行中排除最大元素

具有关联统计信息 N+1 的 Rails 6 索引资源?