Эффективные Объявления Mysql Структура - PullRequest
0 голосов
/ 18 декабря 2009

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

Все эти разделы имеют несколько общих характеристик:

-id
-title
-Боди
статус-листинга
-poster
-отправьте email
дата размещения

Но у каждого из них также есть отдельная информация:

- у каждого есть разные наборы и деревья категорий на выбор (которые влияют на структуру, необходимую для их хранения)
-работы должны хранить такие вещи, как зарплата, дата начала и т. д.
-продажа предметов должны хранить такие вещи, как цены, гобо и т. д.

Таким образом, рекомендуется реорганизовать БД, в то время как я могу, в универсальную таблицу для хранения ВСЕЙ общей информации о списках независимо от раздела, а затем распределить специализированное хранилище данных в небольших таблицах, или лучше оставить текущая структура одна и оставить разделы разделенными?

Ответы [ 2 ]

2 голосов
/ 18 декабря 2009

Звучит так, как будто все они являются отдельными сущностями, которые не имеют ничего общего друг с другом (например, для совместного использования некоторых определений столбцов), верно?

Хотите ли вы когда-нибудь сделать SELECT, как

SELECT *
FROM main_entity
WHERE entity_type IN ('SALE_ITEM', 'JOB', 'PERSONAL')?

В противном случае я не думаю, что объединю их в один стол.

0 голосов
/ 18 декабря 2009

Не используйте одну таблицу. Перейти реляционные.

Я бы порекомендовал установить так называемые полиморфные отношения между вашей «основной» таблицей (таблицей с общими характеристиками) и тремя таблицами, содержащими конкретную информацию. Структура будет выглядеть примерно так:

Основной стол

  • ID
  • название
  • ...
  • имя_категории (VARCHAR или CHAR)
  • category_id (INTEGER)

Таблица категорий

  • ID
  • (конкретные столбцы)

Поле category_name должно содержать имя таблицы таблицы конкретной категории, например. 'job_category', а category_id должен указывать на идентификатор в таблице категорий. Пример будет выглядеть так:

# MAIN TABLE
id  | title         | ... | category_name | category_id
-------------------------------------------------------
123 | Some title    | ... | job_category  | 345
321 | Another title | ... | sale_category | 543

# SPECIFIC TABLE (job_category)
id  | ...
---------
345 | ...

# SPECIFIC TABLE (sale_category)
id  | ...
---------
543 | ...

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

Для извлечения данных наоборот (например, вы что-то ищете в каталоге jobs_), с другой стороны, вы можете извлечь связанные данные из главной таблицы с помощью JOIN. Не забудьте не только присоединиться к main.category_id = jobs_category.id, но и использовать столбец category_name в качестве условия соединения. В противном случае вы можете получить данные, относящиеся к одной из других категорий.

Для оптимальной производительности вы можете индексировать столбцы category_name и category_id. В основном это ускорит любые запросы, объединяющие две таблицы, как описано в предыдущем абзаце.

Надеюсь, это поможет!

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