【问题标题】:The best way to store tags, categories, and int[] in SQL在 SQL 中存储标签、类别和 int[] 的最佳方式
【发布时间】:2015-12-21 11:24:13
【问题描述】:

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

我知道如何使用 SQL,并且对不同的类型和长度有所了解,但我不知道我的表的最佳长度和类型。

我目前的设置方式是:

  • id - BIGINT (20)
  • author_id - BIGINT (20)
  • 标题 - 文字
  • 标签 - VARCHAR (50)
  • 类别 - VARCHAR (50)
  • 项目 - VARCHAR (50)

Tags 是帖子标签的字符串数组,与类别相同。项目将是一个整数数组,它们是与帖子关联的“项目”的 ID。 (每个项目都有自己的页面,当您访问该页面时,您可以获得所有关于它的帖子的列表。

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

更新:

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

【问题讨论】:

  • 有“最优化的”并且有适当的。正确的方法是不要试图把所有东西都塞进一张桌子。谷歌“多对多关系”,这是关系数据库的绝对基础。
  • tags 和 categorizes 应该有自己的表,然后一个表将 post 表连接到每个表
  • 为什么不规范化标签和项目?以数组的形式显示它们是 UI 问题,而不是数据问题。通过在字段中存储为固定数组,修改和搜索变得更加困难。
  • 我目前不确定处理标签和类别等内容的最佳方法。我一直无法找到我需要的关于如何最好地管理这些东西的信息。目前我仍在开发框架,因此它对任何更改/改进都是开放的
  • BIGINT 假设您预计地球上一半的人口将参与其中。我佩服你的野心!但说真的,请参阅规范化。

标签: php mysql sql-server optimization database-schema


【解决方案1】:

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

$foo = serialize($bar);

现在只需存储 $foo。 $bar 甚至可以是完整的对象。事后你可以抓住价值和

$bar = unserialize($foo);

$bar 现在包含您之前想要的任何内容。数组、对象等。这会使你的 sql 表的布局变得懒惰,但由于开始和结束结果只是 php 脚本中的变量,所以表并不重要。只需将字段设置为 text(不是 varchar(max)),您就可以了!

php serialize function

【讨论】:

  • 我希望将它与我的数据库中的查询一起整齐地存储。这样做的方式很酷,我可能会在某个时候使用它:)
【解决方案2】:

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

  • 在您的客户端中压缩标题并存储在 BLOB 中。
  • 将标签(等)放在逗号中并使用FIND_IN_SET() 检查tags 是否包含特定的tag。这会很慢,并且不能使用任何索引。
  • 使用 MyISAM(磁盘占用空间小 2-3 倍)。
  • 最小化索引。
  • 使用 TINYINT/SMALLINT/MEDIUMINT 而不是 INT 或 BIGINT。
  • 使用未签名
  • 如果不需要 utf8,请使用 latin1;在不需要 utf8 的任何内容(例如邮政编码)上使用 latin1。
  • 0.5GB 微不足道;检查其他服务。

【讨论】:

  • 我应该强调,我建议的大部分内容都是不好的做法。我提出它只是因为“空间保护”似乎是最重要的。
猜你喜欢
  • 2011-09-14
  • 1970-01-01
  • 2010-09-13
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2015-08-02
相关资源
最近更新 更多