4

我是数据库新手,我正在考虑为网站创建一个。我从 SQL 开始,但我真的不确定我是否使用了正确的数据库。

这是问题所在:

http://i.imgur.com/B4ZypkC.png

我现在拥有的是第一个选择。这意味着,我的查询看起来像这样:

user_id      photo_id     photo_url
0            0            abc.jpg
0            1            123.jpg
0            2            lol.png

等等。但对我来说,当数据库变得很大时,这似乎有点低效。所以我想要的是图片中显示的第二个选项。像这样的东西,然后:

user_id      photos
0            {abc.jpg, 123.jpg, lol.png}

或类似的东西:

user_id      photo_ids
0            {0, 1, 2}

我找不到类似的东西,我只找到普通的SQL。反正有没有做这样的事情^(即使它不被视为“数据库”)?如果不是,为什么 SQL 在这些情况下更有效?我怎样才能使它更有效率?提前致谢。

4

4 回答 4

7

你最初的方法user_id, photo_id, photo_url是正确的。这是大多数数据库管理系统使用的规范化关系。

以下关系称为“一对多”,因为用户可以拥有许多照片。

您可能希望分离照片详细信息并仅在用户和照片之间提供参考表。

您的第二种方法效率低下的原因是因为数据库的设计目的不是在单个列中搜索或存储多个值。虽然可以以这种方式存储数据,但您不应该这样做。

如果您想使用第二种方法为用户定位特定照片,则必须使用 搜索LIKE,这很可能不会使用任何索引。提取或列出这些照片的过程也会效率低下。

您可以在此处阅读有关基本数据库原则的更多信息。

于 2013-11-05T21:22:32.257 回答
2

您的第一个示例看起来像一个传统的关系数据库,其中一个表在标准的 1:1 键值属性集中每行存储一条记录。这就是数据在 Oracle、MySQL 和 SQL Server 等 RDBMS 中的存储方式。您的第二个示例看起来更像文档数据库或 NoSQL 数据库,其中数据存储在嵌套数据对象(如哈希和数组)中。这就是数据在 MongoDB 等数据库系统中的存储方式。

在任一模型中存储数据都有好处和成本。使用关系数据库,数据分布在多个表中并通过键链接,很容易从多个角度获取数据并将其聚合用于多种目的。对于文档数据库,数据通常更难加入单个查询,但检索速度要快得多,并且通常还格式化为更快的应用程序使用。

对于您的应用程序,如果您只关心在拥有用户 ID 时引用用户的图像,则后者(文档数据库模型)可能是最好的。这对于查询“个人资料图片”类别的所有图像或在某个日期之后上传的所有图像来说并不理想。您可能可以使用任何一种数据库类型来完成您的任务,并且选择正确的数据库将始终取决于它将用于的应用程序,但作为一般经验法则,关系数据库更加灵活且难以出错了。

于 2013-11-05T21:30:09.597 回答
0

你想要的(拥有用户->(photo1,photo2,...))是一种 INDEX :

当您执行您的请求时,它会转到 INDEX 并获取照片表中的 INDEX“用户”,并获取要获取的照片列表。不是所有的数据库都会被查找,它是优化的。

于 2013-11-08T14:38:51.997 回答
-2

我会对 每个用户将拥有的所有列执行类似
Users_Table(One User - One Photo)的操作。
如果一个用户只有一张照片,那么只需在此表中添加一个带有 photo_url 的列

一位用户多张照片
如果一位用户可以拥有多张照片。然后为仅包含来自 Users_Table 的 UserID 以及 Photo_ID 和 Photo_File 的照片单独创建一个表。

许多用户许多照片
如果可以将一张照片分配给多个用户,则为照片创建一个单独的表,其中有 PhotoID 和 Photo_File。第三个表User_Photos可以具有来自 Users_Table 的 UserID 和来自 Photos 表的 Photo_ID。

于 2013-11-05T21:36:00.447 回答