База данных дизайн: соответствие ключей базы данных sql константам php?

Ну, это простой вопрос о дизайне, который я задавал много раз и никогда не находил удовлетворительного решения. Мой пример с 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)

9
задан T.Rob 19 November 2011 в 20:43
поделиться

3 ответа

Почему бы не денормализовать таблицу БД, чтобы вместо usertype_id у вас был usertype со строковым типом ( admin ). Затем в PHP вы можете просто выполнить define ('USERTYPE_ADMIN', 'admin'); . Это избавляет вас от необходимости изменять два места, если вы хотите добавить тип пользователя ...

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

0
ответ дан 5 December 2019 в 02:06
поделиться

Для таблиц, которые будут содержать «типовые» значения, особенно когда ожидается, что такая таблица будет меняться со временем, я обычно использую простой подход: Добавьте столбец 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 различных ролей пользователей - попробуйте «скрытый» подход.

0
ответ дан 5 December 2019 в 02:06
поделиться

Используете ли вы здесь какой-либо фреймворк? Могут ли эти значения храниться в одном источнике — конфигурационном файле, который создает список объектов в PHP, а также заполняет таблицу при начальной загрузке базы данных? Я думаю с точки зрения Rails, так как я давно не писал PHP. Решением, вероятно, будут светильники.

0
ответ дан 5 December 2019 в 02:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: