Mysql Storing Serialized Array - PullRequest
       9

Mysql Storing Serialized Array

4 голосов
/ 15 июля 2009

У меня есть 3 таблицы:

  1. Таблица регионов, в которой 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 : "Гостиницы"; s: 1: "1"; s: 20: "Почтовые службы"; s: 1: "1"; s: 13: "Государство школ"; s: 1: "1"; s: 14: "Деревянные мастера"; с: 1: "1";}

Может кто-нибудь предложить альтернативное решение?

Приветствия

1 Ответ

8 голосов
/ 20 июля 2009

Я бы предложил совершенно другой подход, который полностью избавит от проблемы хранения и сделает ваше приложение более эффективным. Хранение сериализованных массивов, полных информации, которую можно в любом случае извлечь из базы данных, является избыточным и крайне неэффективным. Наилучшим подходом здесь будет нормализация ваших данных.

Вам следует создать четвертую таблицу, возможно, с именем 'region_categories', которая будет простой таблицей поиска:

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

Теперь вместо того, чтобы сохранять все в массив, для каждого города / региона вы должны вместо этого заполнить эту таблицу категориями, которые находятся в этом городе. Размер ваших данных очень мал, так как все, что вы храните, это пара идентификаторов.

Когда приходит время извлекать категории для данного региона, вам просто нужно выполнить простое выражение 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]

Теперь вы можете перебирать результаты, и у вас будут все категории для этого региона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...