Вопрос

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

У меня есть таблица Items, которая содержит всю возможную информацию об элементе, включая поле item_type, которое содержит целочисленное значение, определяющее тип элемента и, в результате, какую информацию об элементе использовать.

т. е.item_type = '1' означает, что предмет является шляпой для использования, а это значит, что необходимой информацией являются только мощность, цена, бонусы и требования.Все это работает нормально.

У меня также есть таблица items_users HABTM, настроенная для хранения всех принадлежащих в данный момент предметов, которые есть у каждого игрока, это также работает нормально.

Что я пытаюсь выяснить, так это то, как будет работать система оборудования.Сначала я подумал о столе для оснащения, таком как:

    CREATE TABLE `aevum_tf`.`equips` (
`id` INT NOT NULL ,
`user_id` INT NOT NULL ,
`hat_id` INT NOT NULL ,
`wep_id` INT NOT NULL ,
`offhand_id` INT NOT NULL ,
`pants_id` INT NOT NULL ,
`acca_id` INT NOT NULL ,
`accb_id` INT NOT NULL ,
`accc_id` INT NOT NULL ,
`shirt_id` INT NOT NULL ,
`created` DATETIME NOT NULL ,
`modified` DATETIME NOT NULL ,
PRIMARY KEY ( `id` ) ,
UNIQUE (
`user_id`
)
) ENGINE = InnoDB 

Единственная проблема при использовании подобной системы заключается в том, что CakePHP не поддерживает несколько внешних ключей для модели.

Есть ли у кого-нибудь какие-либо идеи относительно того, как внедрить такую систему?

Редактировать Существующая таблица HABTM items_users используется для хранения того, какими элементами в данный момент владеет пользователь.Каждый раз, когда пользователь приобретает новый элемент, его идентификатор и идентификатор пользователя сохраняются в таблице items_users.Я просто пытаюсь понять, как внедрить систему оборудования.

Говоря "не поддерживает несколько внешних ключей", я имею в виду, что CakePHP изначально не поддерживает несколько внешних ключей из одной таблицы в другой таблице.В моем примере таблица equips содержит 8 внешних ключей, все указывающие на item_id .

видишь: https://trac.cakephp.org/ticket/1923

Это было полезно?

Решение

Я обнаружил, что отношения HABTM лучше всего подходят для простых отношений, а не для сложных, как вы описали выше.Идея отношения HABTM состоит в том, чтобы сделать таблицу соединений почти невидимой, чтобы вам не нужно было поддерживать дополнительные внешние ключи.Это хорошо работает для простых случаев.

В вашем случае у вас есть таблица equips, которая будет объединена со всеми другими аспектами вашей системы.В дизайне вам нужна отправная точка.Я бы предположил, что "пользователь" был бы этой отправной точкой, и у пользователя было бы много оборудования.Вы можете ограничить пользователя наличием только одного equip, что практически позволяет объединить таблицы user и equips в одну.

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

Пользователь -> Имеет одного -> Оснащает Оснащает -> Принадлежит -> Пользователю

Согласно вашей базе данных deisgn, похоже, что будут установлены следующие взаимосвязи.Экипировка -> Принадлежит -> шляпа Экипировка -> Принадлежит -> Брюки Экипировка -> Принадлежит -> Wep Wep -> У многих -> Экипировка ...

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

$this->User->recursive = 2; 
pr($this->User->find("first");

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

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

Надеюсь, это немного поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top