【问题标题】:Mysql Storing Serialized ArrayMysql存储序列化数组
【发布时间】:2009-07-20 14:47:26
【问题描述】:

我有 3 张桌子:

  1. Regions 表,其中包含 1500 个城镇。
  2. 包含 1800 个类别的类别表。
  3. 包含企业的公司表。

我需要做的是获取一个城镇,例如 Brimingham,并在一个数组中列出哪些类别使用​​我们的主公司表有企业,因此我们没有存储在数组中的任何类别中没有企业布里明翰。

我遇到的问题是要存储的数组的大小,当我使用序列化数组填充所有城镇时,我什至无法打开表进行浏览。请参见下面的数组示例:

a:9:{s:8:"法警";s:1:"1";s:20:"商业顾问";s:1:"1";s:25:"车库和机械师";s:1:"1";s:35:"养殖牲畜和其他动物";s:1:"2";s:19:"时尚配饰";s:1:"1";s:6 :"Hotels";s:1:"1";s:20:"邮局服务";s:1:"1";s:13:"Schools State";s:1:"1";s: 14:"木匠";s:1:"1";}

谁能提出替代解决方案?

干杯

【问题讨论】:

  • 更新:序列化数据太大而无法存储,例如伦敦有 1800 个类别的企业,我可以为每个城镇创建静态 HTMl 页面,但它会给我 1500 个 HTMl 页面。有谁知道服务器必须筛选 1500 个 HTML 页面直到找到要包含的正确页面的缺点?

标签: mysql


【解决方案1】:

我会建议一种完全不同的方法来完全摆脱存储问题,并且应该使您的应用程序更高效。存储可以从数据库中检索到的充满信息的序列化数组是多余的且效率极低。最好的方法是标准化您的数据。

您应该创建第四个表,可能称为“region_categories”,这将是一个简单的查找表:

CREATE TABLE region_categories (
  regionId int unsigned not null,
  categoryId int unsigned not null,
  PRIMARY KEY(regionId,categoryId)
);

现在,对于每个城镇/地区,您应该使用该城镇中的类别填充此表,而不是将所有内容保存到数组中。您的数据量非常小,因为您存储的只是一对 id。

当需要检索给定区域的类别时,您只需运行一个简单的SELECT 语句:

SELECT category.*
FROM region_categories AS rc LEFT JOIN categories AS c ON rc.categoryId=c.categoryId
WHERE rc.regionId=[whatever region you're dealing with]

现在您可以遍历您的结果,并且您将拥有该地区的所有类别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多