13

我们都去过那里 - 考虑下面的例子 - 首先,客户说“每个用户只能有一张个人资料图片”,所以我们在 users 表中添加了一个字段 - 半年后,需求发生变化,用户实际上需要有n张头像。

现在,这似乎只有在您添加一个新表(例如 user_pictures)来处理新的基数 1:n 而不是 1:1 时才有可能。通常这会变得非常复杂。每当我遇到这个问题时,我想知道为什么我们不使用我们可以考虑的所有三个维度。二维表在某种程度上是有限的,它有点不完整 - 如果,参考我们的个人资料图片问题同样,用户表中的图片字段有一个depth,并且该深度使该字段成为一个数组,可以同时完美地表示基数 1:1 和 1:n。

表字段将简单地变成数组并自动支​​持两种基数——这不是吗?至少我会使用它。那里已经有类似的东西了吗?

4

3 回答 3

9

Oracle 支持数组嵌套表。两者似乎都符合您的要求。尽管现在人们更喜欢将所有内容建模为表和关系以保持简单和一致,因此现代 RDBMS 通常不支持这些东西,我也不相信它曾经将它变成标准 SQL。

于 2012-12-14T23:55:08.397 回答
7

标准的多对多方法,多用户对多张个人资料图片,很容易被三表方法覆盖:

表:用户
表:图片
表:User_Pictures

但是,如果您转向 NoSQL 方法,您可以存储一个用户文档(通常为 JSON 格式),该文档将该用户的个人资料图片数组存储在一个表中。

@gordy +1 获取 Oracle 链接。我不确定是否有任何 RDBS 假设的数组。

于 2012-12-14T23:56:57.863 回答
3

您正在描述一种非规范化技术(一个字段的实例有多个列),除非您彻底了解违反基本关系原则的后果,否则它通常会导致眼泪。

当您想在字段上查询(“查找拥有这张图片的用户”)并且您发现一条带有“AND picture IN (pic1, pic2, pic3)” 的 SQL 语句无法被索引并且您的优化器开始计划报复。

于 2012-12-15T00:03:24.720 回答