Mysql存储序列化数组

时间:2009-07-15 09:47:40

标签: mysql

我有3张桌子:

  1. 其中有1500个城镇的地区表。
  2. 分类表有1800个类别。
  3. 包含商家的公司表。
  4. 我需要做的是抓住一个城镇,例如Br​​imingham并列在一个阵列中,哪些类别的业务使用我们的主要公司表,所以我们没有任何类别存储在阵列中没有业务的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 :“酒店”; s:1:“1”; s:20:“邮局服务”; s:1:“1”; s:13:“学校国家”; s:1:“1”; s: 14:“木工匠”; s:1:“1”;}

    有人可以建议替代解决方案吗?

    干杯

1 个答案:

答案 0 :(得分:8)

我建议采用完全不同的方法来完全消除存储问题,并且应该让您的应用更有效率。存储序列化数组,其中包含可以从您的数据库中检索的信息,这是多余的,效率极低。这里最好的方法是规范化您的数据。

您应该创建第四个表,可能称为“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]

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