Ну, это простой вопрос о дизайне, о котором я много раз задумывался и никогда не находил удовлетворительного решения. Мой пример с php-sql, но это, безусловно, относится и к другим языкам.
У меня есть небольшая таблица базы данных, содержащая очень мало записей, которая почти никогда не требует обновления например, эта таблица usertype
:
usertype_id (primary key) | name | description
---------------------------+------------+-------------------
1 | 'admin' | 'Administrator'
2 | 'reguser' | 'Registered user'
3 | 'guest' | 'Guest'
Теперь в коде php мне часто приходится проверять или сравнивать тип пользователя, с которым я имею дело. Поскольку типы пользователей хранятся в базе данных, я могу:
1) Выберите * из таблицы пользовательских типов при создании экземпляра класса и сохраните его в массиве.
Тогда все идентификаторы доступны для кода, и я могу сделать простой выбор, чтобы получить нужные мне строки. Это решение требует массив и запрос базы данных каждый раз, когда создается экземпляр класса.
$query = "SELECT info, foo FROM user WHERE usertype_id = ".$usertypes['admin'];
2) Используйте столбец name
, чтобы выбрать правильный usertype_id
, чтобы мы могли эффективно объединяться с другими таблицами. Это более или менее эквивалентно 1), но без необходимости кэшировать всю таблицу пользовательских типов в объекте php:
$query = "SELECT info, foo FROM user JOIN usertype USING (usertype_id) WHERE usertype.name = 'admin' ";
3) Определите константы, которые соответствуют ключам в таблице пользовательских типов:
// As defines
define("USERTYPE_ADMIN",1);
define("USERTYPE_REGUSER",2);
//Or as class constants
const USERTYPE_ADMIN = 1;
const USERTYPE_REGUSER = 2;
А затем просто выберите.
$query = "SELECT info, foo FROM user WHERE usertype_id = " . USERTYPE_ADMIN;
Это, вероятно, наиболее эффективное с точки зрения ресурсов решение, но его плохо обслуживать, поскольку вам нужно обновить и таблицу, и код, если вам нужно что-то изменить в таблице пользовательских типов.
4) Удалите таблицу usertype
и сохраните только те типы, которые указаны в коде php. Мне это не очень нравится, потому что оно позволяет любому значению попадать в базу данных и назначаться типу пользователя. Но, может быть, учитывая все обстоятельства, это не так уж плохо, и я просто усложняю то, что должно быть простым ..
В любом случае, если подвести итог, то решение, которое мне больше всего нравится, это # 2, потому что оно связное и с индексом на usertype.name
, не может быть таким плохим. Но я часто заканчивал тем, что использовал # 3 для эффективности.
Как бы вы это сделали? Есть лучшие решения?
(редактировать: исправлен запрос в # 2)