Вызывает ли Datamapper for Codeigniter промежуточную таблицу для всех отношений? - PullRequest
1 голос
/ 24 февраля 2010

Я перехожу к ORM для моего приложения codeigniter и выбрал datamapper . Однако в разделе rules указано следующее:

Соединительная таблица должна существовать между каждая связанная нормальные таблицы, независимо типа отношений.

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

Ответы [ 3 ]

2 голосов
/ 14 июня 2010

Нет, фактически, модель с набором отношений $has_one будет иметь поле, заканчивающееся на _id,, которое ссылается на объект с набором отношений $has_many.

Так, например:

class Recipe extends DataMapper {
    var $has_many = array('product', 'rating', 'recipe_category');
    var $has_one = array('recipe_source', 'user');
    (...)
}

class Recipe_Source extends DataMapper {
    var $has_many = array('recipe');
    (...)
}

В этом случае DataMapper создал таблицу recipes со столбцом recipe_source_id и таблицу recipe_sources, для которой не требовалось никаких дополнительных полей.

Теперь для отношений «многие ко многим» будет создана таблица соединения, которая следует строгому соглашению.

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

Итак, используя эту модель:

class Product extends DataMapper {
    var $has_one = array('cheese_style', 'butter_style', 'cheese_flavor');
    var $has_many = array('product_size', 'recipe');
    (...)
}

Теперь я получаю таблицу соединений в моей базе данных с именем products_recipes.

Вот как это обрабатывается библиотекой DMZ DataMapper (http://www.overzealous.com/dmz/),, которая должна быть заменой старой библиотеки stensi DataMapper, поэтому я собираюсь предположить, что соглашения те же .

Несмотря на это, я настоятельно рекомендую переключиться на DMZ.

1 голос
/ 27 января 2012

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

Просто создайте внешний ключ в дочерней таблице, используя соглашение суффикса "_id", и Datamapper распознает его автоматически (по крайней мере, так у меня получилось), Предполагается, что вы настроили атрибуты has_one и has_many в двух моделях. Как country_id в этом примере:

// class User extends DataMapper { var $has_one = array('country'); ... }
CREATE TABLE `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `country_id` int(10) unsigned NOT NULL,
    `username` varchar(20) NOT NULL,
    `password` varchar(50) NOT NULL,
    `confirm_password` varchar(50) NOT NULL,
    `email` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
)

// class Country extends DataMapper { var $has_many = array('user'); ... }
CREATE TABLE `countries` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(50) NOT NULL,
    PRIMARY KEY (`id`)
)
0 голосов
/ 26 февраля 2010

Да, к сожалению, это значит. Это одна из причин, по которой мне пришлось изменить дизайн БД

...