【问题标题】:How should I store different kinds of posts in SQL? (PHP/MySQL)我应该如何在 SQL 中存储不同类型的帖子? (PHP/MySQL)
【发布时间】:2012-08-30 23:24:16
【问题描述】:

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

这是我存储的基本内容

  1. 自动 - int(键索引)
  2. 用户 ID - varchar
  3. 帖子 ID - varchar
  4. 帖子类型 - varchar(YouTube、vimeo、图片、文本、链接)
  5. 文件名 - varchar(原始图像名称或链接标题)
  6. 来源 - varchar(外部链接或文件名 + ext)
  7. 标题 - varchar(用户选择的帖子标题)
  8. 消息 - 文本(用户的实际帖子)
  9. 日期 - int(unix 时间戳)

我在其他表中存储了与帖子相关的其他数据,我使用帖子 ID(如用户信息)获取这些数据,但我真的怀疑这是否是我应该存储信息的方法。我确实使用 PDO,但我担心这种格式可能会非常慢。

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

我似乎找不到任何关于 PHP/MySQL 优化的好资源。我遇到的大多数信息往往是 5 到 10 年前的内容,需要付费的内容,太低级,或者只是简单的文档,无法吸引我超过半小时的注意力。

【问题讨论】:

    标签: php mysql database performance database-design


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      你所拥有的似乎还不错,但你错过了关于索引和键的重要部分。

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

      其次,您是否打算在这些设备上添加搜索功能?在这种情况下,您可能需要启用全文搜索。

      不要试图将数据存储在 JSON 或其他类似的东西中。存储它简单明了。您要做的最后一件事是尝试从数据库中提取一个字段以查看其中的内容。如果您的数据库无法解决,那就是糟糕的设计。

      在这一点上,大桌子没有任何错误。只要它们被很好地索引,一个小表或大表在访问它方面几乎没有什么区别(缺少大量写得不好的 SQL 连接),所以要担心能够获取的简单性从它返回的数据。

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

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

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

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

      【讨论】:

      • 对不起,“自动增量”是一个索引(称为自动),我会修复它以使其更清晰。
      • @Ian 是的,没关系。不过,您仍然需要其他列上的索引,它们将对您的查询效率产生巨大影响。
      • 等等,我如何索引其他键?我的假设是您刚刚添加了一个应用于每个帖子的增量列。我也确实有全文搜索功能设置和工作。
      【解决方案3】:

      此时,暂时坚持使用 RDMS。一旦你对 PHP 和 MySQL 感到满意,那么以后可能会有更多的东西需要学习,比如 NoSQL、MongoDB 等。但就你目前的目的而言,因为每件事都有其目的,这是完全正确的,不会减慢速度。您的表架构似乎正确,几乎没有修改。

      User id 和 Post id 将是整数,我认为这个表是 post 所以 post id 将自动递增,它将是主键。

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

      您还询问了 blob 等问题。请注意,最好将文件存储在文件系统中而不是 db 中,而当想要将文件存储在 DB 表中时,像 blob 等这些字段很好,我不推荐这里.

      【讨论】:

      • 感谢您的建议。用户 ID 和帖子 ID 是随机生成的字母数字,这就是我将它们存储为 varchar 的原因。我的 users 表有一个自动递增的 id 和一个字母数字 id。我这样做主要是为了使 URL 看起来一致。此外,这些文件可以是外部的或本地的,所以如果它是本地的,我只包含对文件名的引用,如果不是,则包含完整的 URL,因为我想不出更好的方法。
      • @lan 是的,那是有道理的,您的架构很好,但是 user_id 是来自其他表的外键吗?
      • 在我创建的任何引用用户的表中,我使用 user_id 而不是用户表中关联的增量。我不认为它会有所作为,因为它是对用户的直接引用。我是否有理由改用密钥?
      • 外键为varchar时可能会有很小的差异,请看stackoverflow.com/questions/1898453/…
      猜你喜欢
      • 2010-09-29
      • 2010-10-14
      • 1970-01-01
      • 2013-06-02
      • 2011-11-24
      • 2014-03-08
      • 2017-07-27
      • 1970-01-01
      • 2017-01-02
      相关资源
      最近更新 更多