Ну, это простой вопрос о дизайне, который я задавал много раз и никогда не находил удовлетворительного решения. Мой пример с php-sql, но это, безусловно, относится и к другим языкам.
У меня есть небольшая таблица базы данных, содержащая очень мало записей, которая почти никогда не нуждается в обновлении. например, таблица usertype
:
usertype_id (primary key) | name | description
---------------------------+------------+-------------------
1 | 'admin' | 'Administrator'
2 | 'reguser' | 'Registered user'
3 | 'guest' | 'Guest'
Теперь в коде php мне часто приходится проверять или сравнивать тип пользователя, с которым я имею дело. Поскольку пользовательские типы хранятся в базе данных, я могу либо:
1) Выбрать * из таблицы пользовательских типов при создании экземпляра класса и сохранить его в массиве.
но это, безусловно, относится и к другим языкам. У меня есть ...
Ну, это простой вопрос о дизайне, который я задавал много раз и никогда не находил удовлетворительного решения. Мой пример с php-sql, но это, безусловно, относится и к другим языкам.
У меня есть небольшая таблица базы данных, содержащая очень мало записей, которая почти никогда не нуждается в обновлении. например, таблица usertype
:
usertype_id (primary key) | name | description
---------------------------+------------+-------------------
1 | 'admin' | 'Administrator'
2 | 'reguser' | 'Registered user'
3 | 'guest' | 'Guest'
Теперь в коде php мне часто приходится проверять или сравнивать тип пользователя, с которым я имею дело. Поскольку пользовательские типы хранятся в базе данных, я могу либо:
1) Выбрать * из таблицы пользовательских типов при создании экземпляра класса и сохранить его в массиве.
но это, безусловно, относится и к другим языкам. У меня есть ...
Ну, это простой вопрос о дизайне, который я задавал много раз и никогда не находил удовлетворительного решения. Мой пример с php-sql, но это, безусловно, относится и к другим языкам.
У меня есть небольшая таблица базы данных, содержащая очень мало записей, которая почти никогда не нуждается в обновлении. например, таблица usertype
:
usertype_id (primary key) | name | description
---------------------------+------------+-------------------
1 | 'admin' | 'Administrator'
2 | 'reguser' | 'Registered user'
3 | 'guest' | 'Guest'
Теперь в коде php мне часто приходится проверять или сравнивать тип пользователя, с которым я имею дело. Поскольку пользовательские типы хранятся в базе данных, я могу либо:
1) Выбрать * из таблицы пользовательских типов при создании экземпляра класса и сохранить его в массиве.
Мой пример с php-sql, но это, безусловно, относится и к другим языкам.
У меня есть небольшая таблица базы данных, содержащая очень мало записей, которая почти никогда не нуждается в обновлении. например, таблица usertype
:
usertype_id (primary key) | name | description
---------------------------+------------+-------------------
1 | 'admin' | 'Administrator'
2 | 'reguser' | 'Registered user'
3 | 'guest' | 'Guest'
Теперь в коде php мне часто приходится проверять или сравнивать тип пользователя, с которым я имею дело. Поскольку пользовательские типы хранятся в базе данных, я могу либо:
1) Выбрать * из таблицы пользовательских типов при создании экземпляра класса и сохранить его в массиве.
Мой пример с 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
table и храните только типы в коде php. Я не Это действительно так, потому что оно позволяет любому значению попадать в базу данных и присваиваться типу пользователя. Но, может быть, учитывая все обстоятельства, это не так уж плохо, и я просто усложняю что-то, что должно быть простым ...
В любом случае, чтобы подвести итог, мне больше всего нравится решение №2, потому что оно связное и с индексом на usertype.name
не может быть так плохо. Но я часто заканчивал тем, что использовал # 3 для эффективности.
Как бы вы это сделали? Есть лучшие решения?
(правка: исправлен запрос в # 2)
Почему бы не денормализовать таблицу БД, чтобы вместо usertype_id
у вас был usertype
со строковым типом ( admin
). Затем в PHP вы можете просто выполнить define ('USERTYPE_ADMIN', 'admin');
. Это избавляет вас от необходимости изменять два места, если вы хотите добавить тип пользователя ...
И если вы действительно беспокоитесь о получении какого-либо значения, вы всегда можете сделать столбец ENUM
тип данных, чтобы он мог управлять самостоятельно ...
Для таблиц, которые будут содержать «типовые» значения, особенно когда ожидается, что такая таблица будет меняться со временем, я обычно использую простой подход: Добавьте столбец Varchar с именем hid (происходит от «человекочитаемого идентификатора») с уникальным ключом. Затем я заполняю его идентификатором, значимым для людей, например:
usertype_id (primary key) | name | description | hid (unique key)
---------------------------+------------+-------------------+---------------
1 | 'admin' | 'Administrator' | 'admin'
2 | 'reguser' | 'Registered user' | 'user'
3 | 'guest' | 'Guest' | 'guest'
Когда вам нужен фактический идентификатор, вам нужно будет сделать выбор на основе столбца hid, т.е.
select usertype_id from tablename where hid = "admin"
Это неэффективный подход, но он обеспечит совместимость вашего приложения между различными развертываниями (т. Е. У одного клиента может быть 1. администратор, 2. гость; другой клиент 1. админ, 2. пользователь и т. Д.). Для вашего случая я думаю, что №3 вполне подходит, но если вы ожидаете, что у вас будет более 10 различных ролей пользователей - попробуйте «скрытый» подход.
Используете ли вы здесь какой-либо фреймворк? Могут ли эти значения храниться в одном источнике — конфигурационном файле, который создает список объектов в PHP, а также заполняет таблицу при начальной загрузке базы данных? Я думаю с точки зрения Rails, так как я давно не писал PHP. Решением, вероятно, будут светильники.