在SQL中存储标记、类别和int[]的最佳方式


The best way to store tags, categories, and int[] in SQL

我正在为我的网站上的博客文章整理表格。

我知道如何使用SQL,我知道一些关于不同的类型和长度,但是我不知道我的表的最佳长度和类型。

我目前设置的方式是:

  • id - BIGINT (20)
  • author_id - BIGINT (20)
  • title - text
  • tags - VARCHAR (50)
  • 分类- VARCHAR (50)
  • projects - VARCHAR (50)

Tags是文章标签的字符串数组,类别也是如此。Projects将是一个整数数组,它们是与该帖子关联的"项目"的id。(每个项目都有自己的页面,当你进入这个页面时,你可以得到一个关于它的所有帖子的列表)。

我的问题是,我可以设置这个表的最优化的方式是什么?

更新:

目前我感兴趣的是最好的方式来存储和优化磁盘使用。现在我有一个免费的x10hosting服务器,我将使用它,它有512mb的限制。如果有必要的话,我可以稍后购买一个更大的服务器,但我想坚持使用免费的服务器,直到我的极限。

对于严格的空间节约要求:

  • 在客户端压缩标题并存储在BLOB中。
  • 将标签(等)放在逗号中,并使用FIND_IN_SET()来检查tags是否包含特定的tag。这将是缓慢的,并且不能使用任何索引。
  • 使用MyISAM(磁盘占用空间小2 -3倍)
  • 减少索引。
  • 使用TINYINT/SMALLINT/MEDIUMINT代替INT或BIGINT。
  • 使用无符号
  • 使用latin1如果你不需要utf8;在任何不需要utf8的地方(例如zipcode)使用latin1。
  • 0.5GB微不足道;检查其他服务

在PHP中,您可以使用一个名为"serialize"的函数,我一直在SQL存储中使用该函数。

$foo = serialize($bar);

现在只存储$foo。$bar甚至可以是完整的对象。之后你可以直接获取值和

$bar = unserialize($foo);

$bar现在包含了之前想要的内容。数组、对象等。这使得您的sql表的布局懒惰,但由于开始和结束的结果只是一个php脚本中的变量,表真的不重要。只要让字段text(不是varchar(max)),你就很轻松了!

php序列化函数