存储配置文件图片的最佳数据库设计

时间:2011-11-13 06:42:18

标签: mysql database database-design

我在数据库设计方面的表现并不是很好,所以我来找你们帮忙。我有一个包含用户记录的表。平板电脑看起来像这样:

+----------+----------+----------+----------+----------+----------+----------+---------
| id       | username | password | firstName| lastName | birthDate|  pictures|  .....
+----------+----------+----------+----------+----------+----------+----------+---------
|    .     |    .     |    .     |    .     |    .     |    .     |    .     |  
|    .     |    .     |    .     |    .     |    .     |    .     |    .     |  .....
     .          .          .          .          .          .          .        

图片字段表示用户上传了多少张图片。
我写了一个功能,允许用户将图片上传到我们的服务器。上传的文件被命名为随机的。用户只允许6张图片。
我目前正在获取文件的位置并将位置存储在如下所示的表中:

+----------+----------+----------+----------+----------+----------+----------+---------
| id       | username | default  | pic1     | pic2     | pic3     |  pic4    |  .....
+----------+----------+----------+----------+----------+----------+----------+---------
|    .     |    .     |    .     |    .     |    .     |    .     |    .     |  
|    .     |    .     |    .     |    .     |    .     |    .     |    .     |  .....
     .          .          .          .          .          .          .        

假设用户有超过0张图片,当访问用户个人资料时,会调用“默认”字段以获取哪个列存储默认图片的地址。例如,如果'default'等于2,则首先拉出并返回“pic2”列中的数据,然后其他非空列将返回其各自的数据。

我的第一个问题是:这种方法有多个表是个坏主意吗?实现一个设计,其中图片有自己的专栏是一个坏主意? 正如你们所知,这种方法在最小程度上是不可扩展的。什么是一个好的,高效,可扩展的设计来实现这个配置文件系统?我期待有50,000到60,000名用户。


如果可能的话,推荐给我一本好书,它会给我一个数据库设计的速成课程! (速成课程请不要太长或详细!)

2 个答案:

答案 0 :(得分:8)

除非有非常具体的理由说明为什么你需要这种设计(非常怀疑),我认为你应该选择以下内容:

users:
- id
- username
- email
- ...

pictures
- id
- user_id
- default (or order)
- picture_location

这可以很好地扩展(假设你有一个user_id的索引),你也可以轻松改变你对每个用户限制的最大图片的想法。当然,限制将由您的申请强制执行。

答案 1 :(得分:2)

我认为在规范化方面有多个表是正确的方法,即一个表用于用户,一个表用于用户的图片。但是,我认为你不应该将每张图片作为一列。正确的方法是在“图片”表格中为每张图片添加一行。

这样,模型可以支持每个用户的任意数量的图片。

我相信@cherouvim已经说了类似的东西