Как создать MySQL таблицу со многими ассоциациями hasMany в CakePHP? - PullRequest
1 голос
/ 19 января 2011

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

В моей базе данных есть много таблиц (которые я бы назвал руководствами), таких как:

  • Навыки
  • Места
  • Деятельность
  • и так далее ...

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

Вопрос в том, как лучше всего этого достичь? Я слышал и читал о 3 решениях, и я не знаком ни с одним из них.

  1. Я читал об использовании UUID, чтобы решить эту проблему, но я не очень хорошо знаю, как они работают. Может ли кто-нибудь уточнить это, если это правильный путь? Что-то о UUID, которые я прочитал, но не совсем понял .

  2. Другая вещь, о которой я читал, - это создание иерархической модели «древовидная таблица», которая будет содержать связи ассоциаций. Больше информации на Управление иерархическими данными в MySQL .

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

UUID звучат наиболее просто, поэтому я был бы признателен за помощь.

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

  • Я бы создал новую таблицу: направляющие, которые могли бы иметь поле UUID.
  • Затем свяжите все эти типы справочников (навыки и т. Д.) С таблицей справочников (справочник как родитель, а другой как ребенок)
  • Родитель и ребенок имеют оба поля UUID, и при создании руководства родитель и ребенок получают одинаковый UUID, чтобы их можно было связать. Ребенок также имеет свое собственное поле Id.
  • Затем свяжите комментарии с руководствами, используя поле UUID, которое указывает на руководство, а также отдельное поле id int для комментариев.

Пожалуйста, скажите мне, если это правильный путь или это полный мусор, и если да, то как мне это сделать?

Ответы [ 3 ]

1 голос
/ 19 января 2011

Хотели ли вы использовать нормальные отношения hasMany с условием? Читайте об этом здесь .

class Skill extends AppModel {
  var $hasMany = array(
    'Comment' => array(
      'className'     => 'Comment',
        'conditions'    => array('Comment.type' => 1), // 1 for skills, 2 for places etc. or something like that.
      )
    );  
}
0 голосов
/ 21 июня 2011

Я прочитал больше о UUID и, поскольку они позволяют использовать уникальные идентификаторы для всего приложения, я смог использовать стиль «наследования» базы данных.

Я использовал свой собственный префикс в начале каждого имени таблицы, чтобы избежать зарезервированногоСтолкновение имен таблиц, таких как объект.Вы можете использовать любой вид префикса, например: my_, и использовать его как: my_object.Все таблицы должны использовать префиксы в этом примере.

Поэтому я создал таблицу Objects.Имеет поле id с типом Binary (36).Cake распознает его как поле UUID.Затем я использовал 1: 1 для идентификации отношений и унаследовал от него другие таблицы, которые я хотел взаимодействовать с другими.

Таким образом, я создал идентификационную связь 1: 1 с таблицей комментариев, видео, изображений, чтобы таблица имела идентифицирующий внешний ключ, являющийся также первичным ключом.

Затем я создал таблицу сопоставлений, в которой я использовал два неидентифицирующих отношения 1: 1 без первичного ключа.Это означает, что это было действительно отношение HABTM к себе.

Теперь это позволяет мне «наследовать» другие таблицы из таблицы объектов, например, таблицу новостей с снова идентифицирующим отношением 1: 1.Тогда можно было связать комментарии или что-либо другое, имеющее отношение идентификации 1: 1 к объекту, к таблице новостей с помощью таблицы сопоставлений.

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

0 голосов
/ 19 января 2011

Отметьте http://cakeapp.com, создайте макет вашей БД и загрузите SQL позже.

...