我应该如何在SQL中存储不同类型的帖子? (PHP / MySQL的)

时间:2012-09-06 07:30:52

标签: php mysql database performance database-design

我正在尝试优化我的PHP和MySQL,但我对SQL数据库的理解充其量是劣质的。我正在创建一个网站(主要用于学习目的),允许用户制作不同类型的帖子(图像/视频/文本/链接)。

以下是我存储的基本知识

  1. 自动 - int (键索引)
  2. 用户ID - varchar
  3. 发布ID - varchar
  4. 帖子类型 - varchar (YouTube,vimeo,图片,文字,链接)
  5. 文件名 - varchar (原始图片名称或链接标题)
  6. 来源 - varchar (外部链接或文件名+分机)
  7. 标题 - varchar (用户选择的帖子标题)
  8. 消息 - 文字(用户的实际帖子)
  9. 日期 - int (unix timestamp)
  10. 我在其他表格中存储了与帖子相关的其他数据,我用post id抓取(如用户信息),但我真的怀疑这是否是我应该存储信息的方法。我确实使用PDO,但我担心这种格式可能会非常慢。

    将帖子信息以其他格式存储会有任何意义吗?我不想要过大的表,所以从性能的角度来看,我应该将一些信息存储为blob / binary / xml / json吗?

    我似乎无法在PHP / MySQL优化上找到任何好的资源。我遇到的大多数信息往往是5到10年,你需要支付的内容,太低级别,或只是直接的文档,不能引起我的注意超过半小时。

3 个答案:

答案 0 :(得分:3)

数据库用于存储“数据”,并且可以快速检索数据。不要切换到其他任何东西,坚持使用数据库。

尽量不要将图片和视频存储在数据库中。将它们存储在磁盘上,并在数据库表中保留对它们的引用。

最后,赶上数据库normalization,它将帮助您使数据库处于最佳状态。

答案 1 :(得分:1)

你有什么似乎没问题,但你错过了关于索引和键的重要部分。

首先,我假设您的主键是字段1.好的,没有问题,但请确保您还在userID,PostID,Date上粘贴索引,并且可能是UserID上的复合,日期。

其次,你打算在这些上有搜索功能吗?在这种情况下,您可能需要启用全文搜索。

不要试图将数据存储在JSON或其他类似的东西中。存储简单明了。你要做的最后一件事是尝试从数据库中提取一个字段,看看里面是什么。如果你的数据库无法解决,那就很糟糕了。

就此而言,没有任何错误的与大表。只要它们被很好地编入索引,一个小表或大表在访问它时就会产生很小的差异(没有写得很糟糕的SQL连接),所以担心简单就能获取从中回来的数据。

编辑:主键是通过某种唯一列标识行的可爱方法。因此,如果要删除行,在您的示例中,您可以指定delete from yourTable where ID=6,并且您知道这只会删除一个行,因为只有一行可以具有ID = 6。

另一方面,索引与键不同,因为它就像数据库中的作弊表,知道表中某些信息的位置。例如,如果在UserID列上有索引,则在查询中传递userID时,数据库不必查看整个表,它会查看索引并知道所有行的位置。用户。

复合索引又向前迈出了一步,如果你知道你想要不断查询UserID和ContentType的数据,你可以添加一个复合索引(意味着一个索引中的BOTH字段的索引)然后,将允许数据库仅使用这两列返回您在查询中指定的数据,而无需筛选整个表 - 甚至不会筛选所有用户帖子以找到正确的内容类型。

现在,索引在服务器上占用了一些额外的空间,所以请记住这一点,但如果你的表变得更大(这完全没问题),效率的提高是惊人的。

答案 2 :(得分:1)

目前,坚持使用RDMS。一旦你对PHP和MySQL感到满意,那么稍后可能会有更多的东西要学习,比如NoSQL,MongoDB等,但是对于你的当前目的,因为每件事都有它的目的,这是非常正确的,不会放慢速度。您的表架构似乎没有什么修改。

用户ID和帖子ID将是整数,我认为此表是post,因此post id将自动递增,并且它将是主键。

其他的是你使用2个字段,文件名和来源,请注意文件名将是上传的文件名,但是如果按来源表示文件的完整路径,那么DB不是存储完整路径的地方。从PHP函数生成路径。每次不在DB中访问该路径。否则,如果您需要更改路径,那么将会产生很大的开销。

你也问过blob等。请注意最好将文件存储在文件系统而不是db中,而像blob等这些字段在将数据存储到数据库表时是好的,我不建议这里