【问题标题】:Database Design for file uploading on posts, comments and profile pages用于在帖子、评论和个人资料页面上上传文件的数据库设计
【发布时间】:2012-07-17 20:42:26
【问题描述】:

我是网络开发的新手,正在尝试实现一个网站,用户可以在该网站上在个人资料页面上上传照片和其他文件(即 .doc、.xls、.ppt、.txt、.pdf 等...),职位和 cmets。我正在使用 s3 存储桶进行文件存储,并将使用 mysql 数据库来存储文件 url 和其他关联数据。我感到困惑的是:

以下哪个是最好的主意?

a) 为以下各项创建文件表:profiles、posts、cmets,然后获取与指定对象(post、comment 或 profile)的 id(A FK) 关联的所有文件。

b) 创建一个文件表,其中包含一个名为“type”的字段,该字段可以是“profile”、“post”、“comment” 和一个名为“id”的字段,它是“type”字段中指定的表的 id 的 FK。

c) 使用任何人都认为更有利的完全不同的架构

编辑:我希望每个文件都与上传者(user_id)相关联,但也附加到它上传的实体(即个人资料、帖子、评论)

【问题讨论】:

  • 这不是一个足够充实的问题。由于不同的原因,这些不同的方法可能会奏效。您需要断言更多的不变量,也许还有一些可能导致其中一个或另一个不舒服的原因。

标签: mysql database-design


【解决方案1】:

我会创建一张表Files 喜欢

Files
|id|file_path|...(other information about the file)

如果PostCommentProfile 只能包含一个文件,您可以直接在表格中添加file_id,如

Posts
|id|data|...|file_id|

如果他们可以拥有多个文件,您将需要一个映射表,例如:

Posts
|id|data|...

Posts_Files_Mapping
|post_id|file_id|

【讨论】:

  • 我想我需要一些映射表,因为对于所有情况(帖子、cmets、配置文件),您可以上传多个文件
  • 那么你需要为每个映射表,这应该是最干净的方式。
【解决方案2】:

正如您所说,您是网络开发的新手。

也许您应该考虑跳过像 mysql 这样的关系型数据库,而使用像 mongodb 这样的“NOSQL”数据库。

mongodb 有很多好处,但其中一个主要优点是“无方案”数据库的概念,它允许您在同一个集合/表中存储不同类型的数据。

但不要认为这是一个简单的出路,您仍然必须对数据建模的最佳方法有一个很好的了解。

【讨论】:

  • 将来我可能会转向 NOSQL 解决方案,尽管我听说 mongodb 的学习曲线相对较低。不过就目前而言,我认为使用我更熟悉的技术(mysql)会更智能。但我很好奇,NOSQL 会如何让我上面提出的问题变得更简单?
  • 不会。传统的关系数据库和扁平的 nosql 数据库都有一个学习曲线,需要您考虑应该如何构建数据。如果您无论如何都必须学习,那么您可能最好深入研究关系数据库,因为它们的使用频率更高,而且如果您知道一个,那么您就具备使用任何关系数据库的基本知识。
  • 当您说您是开发新手时,我认为这也适用于 mysql。但是如果你熟悉mysql,那么你应该坚持下去。使用 mongodb,您可以将每个“数据行”存储为文档。但与关系数据库中的行不同,文档中的字段不是固定的。因此,每个文档可能有不同的数据,具体取决于您拥有的用户/个人资料等信息。
【解决方案3】:

文件是否总是属于同一个“事物”,在您的情况下可能是用户、用户配置文件或人员?

在这种情况下,我将定义一组适用于所有文件类型的通用字段,并包含一个“类型”字段来区分文件类型。

这样的东西可以工作

- User/Person/UserProfile/Account
userId (PK)
firstname
lastname

- File
fileId (PK)
title
description
fileType
userId (FK)
size

现在,如果您希望将文件直接链接到用户,但您可能希望将它们链接到它们放置的帖子,例如在 Facebook 中,这是一个模型。在这种情况下,我会将文件的链接作为帖子内容的一部分嵌入,并将帖子链接到用户。

这取决于您的需求。

【讨论】:

  • 是的,文件归上传者(用户)所有,并与上传的内容类型相关联(帖子、评论、个人资料页面)
  • 基于这么少的信息很难想出一个合适的数据库模型,真的。您正在从显示的角度思考。您问自己的主要问题是“我需要在 X、Y 和 Z 位置显示的文件”。我如何在数据库中表示它。我认为您应该阅读一些数据库设计教程,然后问自己一个问题,“我系统中的实体如何真正组合在一起”。或者你应该提供更多关于你的确切意图的背景信息。 “文件”的显示方式、位置、输入方式等。
  • 本教程可能对你有帮助en.tekstenuitleg.net/articles/software/database-design-tutorial/…面向数据库设计初学者
  • 谢谢。我会尽快通读的。我已经阅读了其他一些教程和数据库规范化并理解了一些基本概念,但我绝对可以使用刷新。
猜你喜欢
  • 2013-12-18
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 2019-06-04
  • 2020-08-22
  • 1970-01-01
相关资源
最近更新 更多