Sql 这种形式的数据库叫什么?

Sql 这种形式的数据库叫什么?,sql,database,database-design,Sql,Database,Database Design,我是数据库新手,我正在考虑为网站创建一个数据库。我从SQL开始,但我真的不确定我是否使用了正确的数据库 问题是: 我现在有第一个选择。这意味着,我的查询如下所示: user_id photo_id photo_url 0 0 abc.jpg 0 1 123.jpg 0 2 lol.png 等等。。但在我看来,当数据库变得很大时,这似乎有点低效。

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

问题是:

我现在有第一个选择。这意味着,我的查询如下所示:

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在这种情况下更有效?我怎样才能使它更有效率?
提前感谢。

您最初获得
用户id、照片id、照片url的方法是正确的。这是大多数数据库管理系统使用的规范化关系

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

您可能希望尽可能地分离照片细节,并在用户和照片之间提供一个参考表

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

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


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

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

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


对于您的应用程序,如果您只有用户ID时才关心引用用户的图像,则后一种(文档数据库模型)可能是最好的。这对于查询“profile pic”类别的所有图像或在特定日期后上载的所有图像来说并不理想。您可能可以使用任意一种数据库类型来完成任务,选择正确的数据库将始终取决于它将用于的应用程序,但根据一般经验,关系数据库更灵活,更难出错。

我会做类似的事情
用户\u表格(一个用户一张照片)
每个用户都将拥有的所有列。如果一个用户只有一张照片,那么只需在此表中添加一列照片url即可

一个用户多张照片
如果一个用户可以有多张照片。然后分别为照片创建一个表,其中仅包含Users_表中的UserID以及Photo_ID和Photo_文件

许多用户有许多照片
如果一张照片可以分配给多个用户,则为照片创建一个单独的表,其中包含PhotoID和Photo_文件。第三个表用户照片,其中可以包含来自用户表的用户ID和来自照片表的照片ID

你想要的(拥有用户->(照片1,照片2,…)是一种索引:


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

为什么您认为将照片存储在单独的行中是“低效的”?这是SQL最适合的安排类型。如果您试图在表中使用逗号分隔的值,您将遇到更多的麻烦。请阅读3NF。不管怎样,我认为这是对数据库的根本性误解。了解数据库规范化和基于集合的操作。您在图像中显示的是用户和照片之间的一对多关系。基本上,您需要一个用户表和一个照片表,其中照片表包含一个“userid”,该“userid”对用户表中的userid具有外键约束。多个用户可以拥有相同的照片吗???我的意思是,如果这不是他们的个人照片。你的回答并没有真正涵盖OP认为这种设计效率低下的观点。@FreshPrinceOfSO,我的回答为他提供了一个详细的设计方法。这有什么问题吗???我会解释为什么你的方法更好。@FreshPrinceOfSO为什么不是?