我是数据库的新手,我正在考虑为网站创建一个。我从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在这种情况下更有效?我怎样才能提高效率? 提前谢谢。
答案 0 :(得分:7)
获得user_id, photo_id, photo_url
的初步方法是正确的。这是大多数数据库管理系统使用的规范化关系。
以下关系称为“一对多”,因为用户可以拥有许多照片。
您可能希望将照片细节分开,只是在用户和照片之间提供参考表。
您的第二种方法效率低下的原因是因为数据库不是设计用于在单个列中搜索或存储多个值。虽然可以以这种方式存储数据,但你不应该这样做。
如果您想使用第二种方法为用户查找特定照片,则必须使用LIKE
进行搜索,这很可能不会使用任何索引。提取或列出这些照片的过程效率也很低。
您可以阅读有关基本数据库原则here的更多信息。
答案 1 :(得分:2)
您的第一个示例看起来像传统的关系数据库,其中一个表在标准的1:1键值属性集中每行存储一条记录。这就是数据存储在RDBMS中的方式,如Oracle,MySQL和SQL Server。您的第二个示例看起来更像是文档数据库或NoSQL数据库,其中数据存储在嵌套数据对象(如散列和数组)中。这就是数据存储在MongoDB等数据库系统中的方式。
在任一模型中存储数据都有好处和成本。对于关系数据库,数据分布在多个表中并通过键链接,很容易从多个角度获取数据并将其聚合用于多种目的。对于文档数据库,数据通常更难以在单个查询中加入,但检索速度要快得多,并且通常还会格式化以便更快地使用应用程序。
对于您的应用程序,后者(文档数据库模型)可能是最好的,如果您只关心在拥有用户ID时引用用户的图像。这对于查询类别“个人资料照片”的所有图像或在特定日期之后上传的所有图像都不是理想的。您可以使用任一数据库类型完成任务,选择正确的数据库将始终取决于它将用于的应用程序,但作为一般经验法则,关系数据库更灵活,更难以出错了。
答案 2 :(得分:0)
你想要什么(有用户 - >(photo1,photo2,...))是一种索引:
当您执行请求时,它将转到INDEX并在照片表中获取INDEX“用户”,并获取照片列表以进行提取。并非所有数据库都会被查找,它已经过优化。
答案 3 :(得分:-2)
我会做类似的事情
Users_Table(一个用户 - 一张照片)
包含每个用户都拥有的所有列。如果一个用户只有一张照片,那么只需在此表格中添加一列photo_url
一位用户多张照片
如果一个用户可以拥有多张照片。然后分别为照片创建一个表格,其中只包含来自Users_Table的UserID以及Photo_ID和Photo_File。
许多用户有很多照片
如果可以将一张照片分配给多个用户,则为照片创建一个单独的表格,其中有PhotoID和Photo_File。第三张表 User_Photos ,其中包含来自Users_Table的UserID和来自Photos Table的Photo_ID。