Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 在数据库中使用数组是一种糟糕的设计吗?_Database_Postgresql_Database Design - Fatal编程技术网

Database 在数据库中使用数组是一种糟糕的设计吗?

Database 在数据库中使用数组是一种糟糕的设计吗?,database,postgresql,database-design,Database,Postgresql,Database Design,因此,我正在为一个个人项目创建一个数据库,只是为了让我对PostgreSQL和某些可以使用PostgreSQL数据库的语言和应用程序更加了解 我已经意识到,使用阵列甚至不一定符合1NF(阵列不是原子的,对吗?)。所以我的问题是:这种方式是否缺乏效率或数据安全?我应该早点学会不使用数组吗?标题的简短回答:否 再长一点回答: 您应该学会在适当的时候使用数组。数组本身的设计也不错,它们就像一个字符变化字段(字符数组,不是吗?)一样具有原子性,它们的存在是为了让我们的生活更轻松,让我们的数据库更快、更轻

因此,我正在为一个个人项目创建一个数据库,只是为了让我对PostgreSQL和某些可以使用PostgreSQL数据库的语言和应用程序更加了解


我已经意识到,使用阵列甚至不一定符合1NF(阵列不是原子的,对吗?)。所以我的问题是:这种方式是否缺乏效率或数据安全?我应该早点学会不使用数组吗?

标题的简短回答:否

再长一点回答

您应该学会在适当的时候使用数组。数组本身的设计也不错,它们就像一个字符变化字段(字符数组,不是吗?)一样具有原子性,它们的存在是为了让我们的生活更轻松,让我们的数据库更快、更轻巧。在考虑可移植性时存在一些问题(大多数数据库系统不支持数组,或者以与Postgres不同的方式支持数组)

例如:

你有一个带有帖子和标签的博客,每个帖子可能有0个或更多标签。首先想到的是用两列
postid
tagid
创建一个不同的表,并分配该表中的标记

如果我们需要用tagid搜索文章,那么就需要额外的表(当然要有适当的索引)

但是如果我们只希望标签信息显示为帖子的额外信息,那么我们可以很容易地在帖子表中添加一个整数数组列,并从中提取信息。这仍然可以使用额外的表来完成,但是使用数组可以减少数据库的大小(不需要额外的表或行),并通过让我们通过连接一个较少的表来执行select查询来简化查询,并且看起来更易于人眼理解(最后一部分在旁观者的眼中,但我想我在这里代表了大多数人)。如果我们的标签是预加载的,那么甚至不需要一个连接

这个例子可能不好,但它是我第一次想到的

结论

阵列是不必要的。如果使用错误,它们可能有害。没有阵列,您可以生存,并拥有一个强大、快速和优化的数据库。当您考虑可移植性(例如,重写系统以与其他数据库一起工作)时,您不得使用阵列


如果你确信你会坚持使用Postgres,那么你可以在你认为合适的地方安全地使用数组。它们的存在是有原因的,既不是糟糕的设计,也不是不合规的。当你在正确的地方使用它们时,它们可以在简化数据库结构和代码以及优化空间和速度方面起到一点作用。仅此而已

数组是否是原子的取决于您感兴趣的内容。如果您通常想要整个数组,那么它是原子的。如果您对单个元素更感兴趣,那么它将被用作结构。文本字段基本上是一个字符列表。但是,我们通常对整个字符串感兴趣

现在,从实际的角度来看,许多框架和ORM不会自动解包PostgreSQL的数组类型。此外,如果您想将数据库移植到MySQL,那么


同样,外键约束也不能添加到数组中(除非在9.3中-似乎没有).

简短回答:是的,这是一个糟糕的设计。使用数组将保证您的设计不是1NF,因为要成为1NF,必须没有重复的值。正确的设计是明确的:为数组的值创建另一个表,并在需要时加入

在某些有限的情况下,数组可能是完成这项工作的合适工具,但我仍然会尽力避免使用它们。它们是最后的手段


数组最大的问题是它们是一个拐杖。你已经知道它们,并且你想使用它们,因为它们对你来说很熟悉。但是它们的工作方式与你期望的不一样,它们只会让你推迟对SQL和关系数据库的真正理解。你最好等到被迫使用它们时再使用它们,而不是我获取它们并寻找依赖它们的机会。

我相信,在处理类似阵列的数据并希望利用SQL的强大功能进行高效查询和分析的情况下,阵列是一种有用且合适的设计。我已经开始定期使用PostgreSQL阵列进行数据科学研究,以及在PostGIS中进行边缘分析,作为例子

除了上面提到的那些解释得很好的挑战之外,我还发现了让第三方客户端应用程序能够以我期望的方式处理数组字段的最大问题。例如,在Tableau和QGIS中,数组被视为字符串,因此数组操作不可用

数组是SQL标准中的第一类数据类型,通常允许更简单的架构和更高效的查询。通常,数组是一种非常好的数据类型。如果您的实现是自包含的,并且不需要依赖没有API或其他可处理不兼容性的中间件的第三方工具,则使用数组字段


但是,如果您与直接查询数据库的第三方软件交互,并且使用数组生成查询,那么我会避免使用更简单的查找表和其他传统的关系方法。

谁说数组不是原子的?我从未在手册中读过这句话。让单元格包含多个值是不可能的从我所读到的内容来看,t原子是设计中的。有一个例子。看看这个q/a;同样的情况也适用于数组。只要DB支持数据类型并有匹配的运算符集,一切都是好的。在(PostgreSQL-integer[]最佳实践)中有很好的答案实际上,数组符合SQL标准。
create table foo(readings integer array[5])
是SQL标准的一部分。这篇文章写得非常好,我要记住,如果我离开PostgreSQL,我可能需要进行一些重构