Каков наилучший способ хранить отдельные неповторяющиеся данные в базе данных? - PullRequest
10 голосов
/ 21 марта 2012

Какова наилучшая практика для хранения данных в базе данных, когда требуется только одна запись. Примером могут служить данные конфигурации, которые относятся ко всему приложению / веб-сайту. Обычно для этого создается таблица, в которой есть только одна запись?

Я спрашиваю в контексте базы данных MongoDB, хотя думаю, что этот вопрос также подходит для баз данных SQL.

Ответы [ 6 ]

6 голосов
/ 21 марта 2012

Пример вспомогательной таблицы, обычно находящейся в базах данных, будет называться Constants и может содержать такие значения числа pi, что начинается идея, что все приложения, использующие базу данных, должны использовать одинаковый масштаб и точность. В стандартном SQL, чтобы убедиться, что они не более одной строки, например ( от Джо Селко ):

CREATE TABLE Constants
(
 lock CHAR(1) DEFAULT 'X' NOT NULL PRIMARY KEY, 
 CHECK (lock = 'X'),
 pi FLOAT DEFAULT 3.142592653 NOT NULL,
 e FLOAT DEFAULT 2.71828182 NOT NULL,
 phi FLOAT DEFAULT 1.6180339887 NOT NULL, 
 ...
);

Поскольку mySQL не поддерживает ограничение CHECK, для достижения этого необходим триггер.

4 голосов
/ 21 марта 2012

С таблицей все в порядке, нет причин, почему бы не использовать ее только потому, что в ней будет только одна строка.

У меня просто была самая странная идея (я бы ее не реализовал, но по какой-то причине я подумал об этом). Вы можете создать жестко запрограммированный вид, например так:

create view myConfigView 
as
select 'myConfigvalue1' as configValue1, 'myConfigvalue2' as configValue2

и сделать select * from myConfigView:)

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

1 голос
/ 21 марта 2012

Если вы используете БД SQL, у вас, вероятно, будут столбцы, такие как имя ключа и значение, и каждый атрибут будет сохранен в виде строки. В MongoDB вы можете хранить все связанные конфигурации в виде одного документа JSON

0 голосов
/ 21 марта 2012

Я бы просто создал таблицу для конфигураций, как сказал rainecc, и использовал бы кеш, чтобы затем перенести всю эту таблицу в память :) и использовать ее оттуда (кеш). Это будет лучшим.

0 голосов
/ 21 марта 2012

Я использую таблицу конфигурации с именем (config_name) и значением (config_value). Я даже добавил поле справки, чтобы пользователи могли видеть, для чего предназначена пара имя / значение или где она используется.

CREATE TABLE  config (
  config_id bigint unsigned NOT NULL auto_increment,
  config_name varchar(128) NOT NULL,
  config_value text NOT NULL,
  config_help text COMMENT 'help',
  PRIMARY KEY  (config_id),
  UNIQUE KEY ix_config_name (config_name),
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Затем следующий php-код восстанавливает значение ключа или возвращает пустую строку. Предполагается, что $ db является открытым подключением к базе данных. Все записи должны быть в нижнем регистре.

function getConfigValue($name) {
    $retval='';
    $db = $this->db;
    $sql = 'select config_value from config where LOWER(config_name)="'.strtolower($name).'"';
    $result = $db->Query($sql);
    if ($result) {
        $row = $db->FetchAssoc($result);
        $retval = $row['config_value'];
    }
    return $retval;
}

Все mysql / php в этом случае, но общий принцип остается.

0 голосов
/ 21 марта 2012

Для баз данных MongoDB я обычно просто создаю новую «таблицу», но для баз данных SQL это влечет за собой гораздо больше (особенно, когда другие работают с той же базой данных; SQL не так податлив), поэтомуВы можете быть немного осторожнее с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...