Слишком много таблиц БД с CakePHP из-за отсутствия поддержки ENUM - PullRequest
1 голос
/ 05 ноября 2011

Я разрабатываю приложение с CakePHP, и у меня возникают некоторые проблемы с моей БД.Проблема в том, что у меня есть несколько таблиц с такими столбцами: пол (мужской / женский), вид (изображение, видео, текст, песня, ссылка, ...), ...

Существует многоспособ решения этой проблемы:

  1. Создание связанных таблиц с указанием пола, типа носителя, ... но у меня уже есть много таблиц, поэтому я не хочу перебивать свою БД.
  2. Выберите тип данных ENUM для столбцов, но CakePHP это не нравится.
  3. Используйте 1,2,3, ... в качестве индекса для этих столбцов и отображайте массив в PHP для каждого столбца (нехорошая идея, на мой взгляд, где создавать экземпляры этих aray? трудно узнать реальную стоимость элемента в БД, ...).
  4. Использовать реальное, полное текстовое значение столбца для каждогоэлементов в таблице, но это избыточно, так что потеря памяти.

Лично я считаю, что 4-я возможность - лучшая, но я хотел бы иметь другие мнения или идеи для решения этой проблемы.

Заранее спасибо!

РЕДАКТИРОВАТЬ: Я думаю о другом способе решить эту проблему.Если я составлю таблицу для каждого списка, у меня будет много таблиц с несколькими пунктами, и это проблема для обслуживания БД.Но если я сделаю стол для бывшего."app_contants", которые имеют идентификатор, имя и категорию (например: '1', 'female', 'user_sex').Все таблицы, которые нуждаются в элементе списка, будут ссылаться на эту таблицу, и если мне нужен конкретный список этой таблицы, я просто должен сделать «$ this-> AppContants-> find ('list', array ('condition' =>массив ('category', 'user_sex'))); "

Что вы думаете об этом?

Ответы [ 3 ]

3 голосов
/ 06 ноября 2011

существует множество решений:

например, источник данных массива

Но я предпочитаю работать с константами классов и статическими методами, представляющими перечисления: http://www.dereuromark.de/2010/06/24/static-enums-or-semihardcoded-attributes/

Несколько месяцев назад я даже добавил поддержку Enum в свои шаблоны выпечки.Заставляет их работать "из коробки" - никому не нужны перечисления базы данных.

1 голос
/ 07 ноября 2011

Просто используйте источник данных массива - и найдите :: list для построения наборов значений для ваших форм. Источник данных массива дает вам доступ точно так же, как если бы у вас были данные в базе данных, в комплекте с отношениями и фильтрацией запросов.

Это также означает, что вы не полагаетесь на enum @ уровень mysql (что делает ваше приложение переносимым) и предоставляет вам доступ к массивам данных для тестирования. Другой вариант, который я использовал, очень похож на метод статических перечислений, связанный выше.

1 голос
/ 05 ноября 2011

На мой взгляд, 3 - это путь.

Создайте свой массив в app_controller, он будет доступен со всех контроллеров.

Вы правы, место, где должны быть массивы, находится в app_helper.Они понадобятся вам для отображения значения пользователю и для построения выбранных элементов в форме, я немного устал, наверное.

Если по каким-то причинам они вам нужны в модели или контроллере, скопируйте ихв app_model и app_controller.

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