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


How should I store different kinds of posts in SQL? (PHP/MySQL)

我试图优化我的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时间戳)

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

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

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

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

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

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

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

首先,我假设您的主键将是字段1。好吧,没有问题,但要确保你也在userID,PostID,Date上粘贴了一个索引,可能还有userID,Date的一个组合。

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

不要试图将数据存储在JSON或其他类似的东西中。简单明了地储存。您最不想做的事情就是尝试从数据库中提取一个字段,看看里面有什么。如果数据库不能解决这个问题,那就是糟糕的设计。

注意,大表没有任何错误。只要它们被很好地索引,一个小表或大表在访问它方面几乎没有什么区别(除了写得很糟糕的巨大SQL联接),所以要担心能够从中获取数据的简单性。

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

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

如果您知道要不断查询UserID和ContentType的数据,那么复合索引又向前迈进了一步,您可以添加一个复合索引(意味着一个索引中两个字段的索引),这样数据库就可以使用这两列只返回您在查询中指定的数据,而不必筛选整个表,甚至不必筛选所有用户的帖子来找到合适的内容类型。

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

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

用户id和发布id将是整数,我认为这个表是发布的,所以发布id将自动递增,它将是主键。

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

你还问过blob等。请注意,最好将文件存储在文件系统中,而不是数据库中,而当你想将文件存储到数据库表中时,blob等字段是很好的,我在这里不建议这样做。