我在数据库设计方面的表现并不是很好,所以我来找你们帮忙。我有一个包含用户记录的表。平板电脑看起来像这样:
+----------+----------+----------+----------+----------+----------+----------+---------
| id | username | password | firstName| lastName | birthDate| pictures| .....
+----------+----------+----------+----------+----------+----------+----------+---------
| . | . | . | . | . | . | . |
| . | . | . | . | . | . | . | .....
. . . . . . .
图片字段表示用户上传了多少张图片。
我写了一个功能,允许用户将图片上传到我们的服务器。上传的文件被命名为随机的。用户只允许6张图片。
我目前正在获取文件的位置并将位置存储在如下所示的表中:
+----------+----------+----------+----------+----------+----------+----------+---------
| id | username | default | pic1 | pic2 | pic3 | pic4 | .....
+----------+----------+----------+----------+----------+----------+----------+---------
| . | . | . | . | . | . | . |
| . | . | . | . | . | . | . | .....
. . . . . . .
假设用户有超过0张图片,当访问用户个人资料时,会调用“默认”字段以获取哪个列存储默认图片的地址。例如,如果'default'等于2,则首先拉出并返回“pic2”列中的数据,然后其他非空列将返回其各自的数据。
我的第一个问题是:这种方法有多个表是个坏主意吗?实现一个设计,其中图片有自己的专栏是一个坏主意? 正如你们所知,这种方法在最小程度上是不可扩展的。什么是一个好的,高效,可扩展的设计来实现这个配置文件系统?我期待有50,000到60,000名用户。
如果可能的话,推荐给我一本好书,它会给我一个数据库设计的速成课程! (速成课程请不要太长或详细!)
答案 0 :(得分:8)
除非有非常具体的理由说明为什么你需要这种设计(非常怀疑),我认为你应该选择以下内容:
users:
- id
- username
- email
- ...
pictures
- id
- user_id
- default (or order)
- picture_location
这可以很好地扩展(假设你有一个user_id的索引),你也可以轻松改变你对每个用户限制的最大图片的想法。当然,限制将由您的申请强制执行。
答案 1 :(得分:2)
我认为在规范化方面有多个表是正确的方法,即一个表用于用户,一个表用于用户的图片。但是,我认为你不应该将每张图片作为一列。正确的方法是在“图片”表格中为每张图片添加一行。
这样,模型可以支持每个用户的任意数量的图片。
我相信@cherouvim已经说了类似的东西