【问题标题】:Best database design for storing profile pictures用于存储个人资料图片的最佳数据库设计
【发布时间】:2011-12-27 22:43:56
【问题描述】:

我在数据库设计方面不是很好,所以我来找你们寻求帮助。我有一张用户记录表。平板电脑看起来像这样:

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

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

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

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

我的第一个问题是:这种拥有多个表的方法是不是一个坏主意?实施图片有自己的列的设计是个坏主意吗?
正如你们所看到的,这种方法一点也不可扩展。什么是实现此配置文件系统的良好、 高效 的可扩展设计?我预计会有 50,000 - 60,000 个用户。


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

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

    您不应该将图片存储为列,而是有一个名为 picture 的列和一个名为 default 的 bool 变量,用于指示图片是否为默认值

    Pics
    (
        Id,
        User_Id,
        Pic,
        Default bit
    )
    

    查看Best Database Design and optimization books这个线程

    【讨论】:

      【解决方案2】:

      我相信拥有多个表格是规范化的正确方法,即一张用于用户的表格和一张用于用户图片的表格。但是,我认为您不应该将每张图片都作为一列。正确的方法是在“图片”表中为每张图片设置一行。

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

      我相信@cherouvim 已经说过类似的话

      【讨论】:

        【解决方案3】:

        除非有非常具体的原因需要这种设计(非常怀疑),否则我认为您应该采用以下方式:

        users:
        - id
        - username
        - email
        - ...
        
        pictures
        - id
        - user_id
        - default (or order)
        - picture_location
        

        这可以很好地扩展(假设您在 user_id 上有一个索引),而且您可以轻松地改变对每个用户的最大图片限制的想法。当然,该限制将由您的应用程序强制执行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多