当没有理由查询项目时,我是否应该打破存储项目列表的原子性规则?

问题描述 投票:0回答:1

同一个item可能属于多个list,每个list有很多item

“正确”的设计:创建一个连接表,其中包含 list_ID 和 item_ID。当我想要列表中的所有项目时,查询 list_ID。

打破原子性规则的设计:做一个简单表。主键,以及重复列或非原子列。这些偏差的缺点是无法有效地查询项目。

将数据库规范化为 1NF 确保每一列都是原子的,所以我不应该做选项 B。那会使查询项目变得困难。例如。 “这件商品卖出了多少?”或者“这个项目在列表中出现了多少次?”

我永远不需要那些数据。当没有理由查询项目时,我是否应该打破存储项目列表的原子性规则?与需要扫描整个连接表的连接表相比。

这已经是一个错误了吗?有没有像“你总是希望能够查询,而当你扩展时你将没有时间重新组织数据库”这样的模因?我是否高估了 MySQL 扫描连接表所需的时间?

如果我知道缺陷对应用程序不重要,那么接受不符合要求的表格是常识。

database-schema database-normalization multivalue
1个回答
1
投票

TL; DR 如果您要编写关于列的部分值的通用查询/约束表达式,那么这些部分应该有自己的列;否则不会。如果您改变主意,那么您可以通过视图提供旧模式,尽管通常更新需要重新编码。


关系有行,每一列都有一个该列类型的值。就 “原子性” 的某些概念而言,“关系”或“规范化”或“1NF”的概念是模糊的、混乱的和无益的。例如,一个列表通常被称为“非原子的”,而一个字符串被称为“原子的”——尽管字符串是一个字符列表。咬紧牙关——这是胡说八道。

每一个设计 都必须就其 列类型 做出这个乌龟停止的决定。这是无法避免的。 (即使您遇到位类型的列,您也可以决定为只有 1 的行创建一个单独的表。)(然后没有列,因此没有列类型。)这是一个设计质量问题,但是不是标准化为更高 NF(正常形式)的问题。

“规范化”到更高 NF 的任何内容(通过用连接回它的表替换表来减少某些更新/冗余问题)都需要事先依赖于应用程序的“规范化”到每个“原子性”的“1NF”(替换表通过一些表,其列的部分列)。因为当重新排列为“1NF”时 help 我们需要编写涉及部分列值的约束表达式,所以我们将进行重新排列 anyway.

(不幸的是,“规范化”和“1NF”和“0NF”以许多不同的方式使用,尽管很常见但很多都是荒谬的。最好只说出您的意思是什么。)


PS 1 列表通常被认为是有序的项目集合,集合是无序的项目集合。谓词“collection C has item I as Nth member”记录一个列表,“collection C has item I as a member”一个集合。

PS 2 PS 你假设列表或集合的表示“垂直”或“紧凑地”“向下”表格中的列涉及比“水平”或“紧凑地”“跨越”值的表示更多的“扫描”在一行中的列中是幼稚/不合理的。即 ((list, item1, 1), (list, item2, 2), ...) vs (list, [item1, item2, ...]).

© www.soinside.com 2019 - 2024. All rights reserved.