05.01.2016, 00:46
Quote:
Всем привет!
Имеются 2 таблицы: Accounts: id | name | pass | chars Characters: id | from | name | level Вопрос: Как лучше привязать к аккаунту персонаж? Путём имя аккаунта с полей "from"? String Или путём id аккаунта с полей "from"? Int И на последок, как привязать эти поля к друг другу? На примере пожалуйста. |
Полагаю, речь идет о MySQL, и о движке MyISAM, который используется чаще всего (если не ошибаюсь, по умолчанию).
Реляционные СУБД как раз и были разработаны для таких задач.
Отвечу кратко - добавьте внешний уникальный ключ в таблицу Characters на Accounts.id
PHP код:
ALTER TABLE `Characters` # Изменить таблицу Characters
ADD COLUMN `account` INT(11) NULL, # Добавить поле 'account' (должно иметь тот же тип данных, что и Accounts.id), NULL значит "разрешить использовать пустое значение" (в вашем случае это значит "персонажам могут быть не назначены аккаунты" - полезно, например, при передаче аккаунта, но если вы это делать не планируете, напишите NOT NULL)
ADD UNIQUE INDEX `account` (`account`), # Добавить уникальный индекс 'account' на одноименное поле. Это не позволит добавить в таблицу две записи с одинаковой ссылкой на аккаунт (акканут не сможет иметь больше 1 персонажа). Если вы хотите дать возможность игрокам создавать несколько персонажей на один аккаунт, не пишите эту строку
ADD CONSTRAINT `fk_account_character` FOREIGN KEY (`account`) REFERENCES `Accounts` (`id`) ON UPDATE CASCADE ON DELETE CASCADE; # Добавить внешний ключ Character.account к Accounts.id, при изменении ID аккаунта - изменять соответственно Character.account, при удалении аккаунта соответственно удалять персонажей аккаунта
Кстати, пример выше должен выглядеть так
PHP код:
SELECT Characters .*
FROM Characters, Accounts
WHERE Accounts.name = "Davidoff"
AND Characters.account = Accounts.id
P.S> Я ответил на вопрос, в котором нет ничего про скрипты и программы. Скажу еще вот что - использование связей в субд сохраняет целостность базы, и не освобождает от проверок в скриптах игрового мода. Это значит, что вы по-прежнему должны проверять, существуют ли аккаунты, которым вы создаете персонажей и т.п.
Кстати, СуБД со связями между сущностями может вас обругать, но только если ваши скрипты работают неправильно или происходят какие-то сбои. Поверьте, лучше один раз увидеть ошибку и не создать новому игроку персонаж, чем через полгода обнаружить сотни аккаунтов без персонажей или, что еще хуже, с одинаковыми ID персонажей