2012-12-14 43 views
7

我们都一直在那里 - 考虑下面的例子 - 首先,客户说“每个用户只有一个配置文件图片”,所以我们添加一个字段到用户表 - 半年后,要求改变,用户实际上需要具有n张个人资料照片。三维数据库表

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

表字段只会变成数组并自动支​​持这两个基数 - 这不是什么吗?至少我会用它。有没有像这样的东西呢?

+0

涵盖了数据库中“事物”(一对一,一对多,多对多)之间的所有可能关系。什么是“三维”表的用例 - 无论这意味着什么? – NullUserException

+0

上面的示例用例是个人档案图片:您需要添加一个新表格,但这显然很麻烦。模型关系需要改变,查询更新等 - 涉及很多痛苦和工作。我认为我们能够做得比这更好。是不是一个二维的领域,使桌子三维解决这个问题? – weltschmerz

+1

关系数据库由一个非常坚实的基础 - [关系代数](http://en.wikipedia.org/wiki/Relational_algebra)支持。它确保它们既快速又正确。这就是为什么当其他类型的数据库多年来一直存在的原因之一。不要修复没有损坏的东西。 – NullUserException

回答

7

Oracle支持arrays以及nested tables。要么似乎符合你的要求。现在,尽管人们更喜欢将表格和关系模型化,以保持事物的简单性和一致性,所以现代的RDBMS通常不支持这些东西,我也不相信它将它们变成了标准的SQL。

+0

很好的答案,谢谢你的链接! – weltschmerz

4

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

表:用户
表:图片
表:User_Pictures

但是,如果您转移到NoSQL方法,则可以存储用户文档(通常采用JSON格式),该文档会将该用户的一组配置文件图片存储在单个表中。

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

2

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

当您想在字段上查询(“查找拥有此图片的用户”)并且您发现带有“AND图片IN(图片1,图片2,图片3)”的SQL语句时,被索引,你的优化器开始计划报复。

+0

+1提及索引 – weltschmerz