Пары ключ/значение в таблице базы данных

Вы можете использовать gsub с регулярным выражением, подобным этому:

text = "[text1](https://www.stackoverflow.com) and [text2](https://www.google.com)"

text.gsub(/\[(.*?)\]\((.*?)\)/, "#{$1} #{$2}")
#=> "text2 https://www.google.com and text2 https://www.google.com"
11
задан Bill Karwin 26 March 2009 в 18:19
поделиться

5 ответов

Не оптимизируйте это, если Вы не имеете к. Какова средняя длина ключа? Эта таблица будет настолько большой это разве, все не впишутся в память Вашего сервера, если Вы реализуете его наивный путь? Я предложил бы реализовать его самый простой путь, измерил бы уровень и затем повторно реализовал бы, только если производительность является проблемой.

Если производительность является проблемой, то использование целочисленного ключа и отдельной таблицы является, вероятно, способом пойти (СОЕДИНЕНИЯ на целочисленных столбцах обычно быстрее, чем СОЕДИНЕНИЯ с помощью столбцов строки переменной длины). Но первое правило оптимизации является МЕРОЙ СНАЧАЛА - удостоверяются, что Ваш предположительно-оптимизированный-код на самом деле делает вещь выполненной быстрее.

5
ответ дан 3 December 2019 в 01:39
поделиться

Вы используете модель базы данных под названием Значение атрибута объекта. Это - распространенный способ сохранить пары ключ/значение в реляционной базе данных, но это имеет много слабых мест относительно нормализации базы данных и эффективности.

Да, дизайн таблицы, который Вы показали, является наиболее распространенным способом сделать это. В этом дизайне каждый атрибут каждого объекта вкладывает отличную строку Ваш KeyValue таблица.

Примените пару ключ/значение к группе объектов: необходимо добавить одну строку для каждого объекта в группе.

INSERT INTO KeyValue (id, key, value) VALUES (101, 'color', 'green');
INSERT INTO KeyValue (id, key, value) VALUES (102, 'color', 'green');
INSERT INTO KeyValue (id, key, value) VALUES (103, 'color', 'green');

Можно также подготовить оператор INSERT с параметрами и пробежать много идентификаторов объекта в цикле, или что бы то ни было.

Перечислите все в настоящее время активные ключи:

SELECT DISTINCT Key FROM KeyValue;

Определите все объекты, которые имеют значение для данного ключа:

SELECT id FROM KeyValue WHERE Key = 'color';

Определите все объекты, где значение, связанное с данным ключом, соответствует некоторым критериям:

SELECT id FROM KeyValue WHERE Value = 'green';

Некоторые проблемы со Значением атрибута объекта:

  • Никакой способ удостовериться ключи не записан то же для всех объектов
  • Никакой способ сделать некоторые ключи обязательными для всех объектов (т.е. NOT NULL в стандартном дизайне таблицы).
  • Все ключи должны использовать VARCHAR для значения; не может сохранить различные типы данных на ключ.
  • Никакой способ использовать ссылочную целостность; не может сделать FOREIGN KEY, который относится к значениям некоторых ключей и не других.

В основном Значение атрибута объекта не является нормализованным проектированием баз данных.

30
ответ дан 3 December 2019 в 01:39
поделиться

Опция, которую может стоить исследовать, переваривает ключ с помощью SHA1 или MD5 прежде, чем вставить его в таблицу.

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

1
ответ дан 3 December 2019 в 01:39
поделиться

Это кажется мне как Вы, мог бы иметь пару проектных решений.

Выбор 1: два дизайна таблицы Вы намекнули в своем ответе

Keys (
 id int not null auto_increment
 key string/int
)
values (
 id int not null auto_increment
 key_id int
 value string/varchar/int
)

Выбор 2: возможно, поскольку sambo99 указал, что Вы могли изменить это:

keys (
 id int not null auto_increment
 key string/int
 hash_code int -- this would be computed by the inserting code, so that lookups would effectively have the id, and you can look them up directly
)

values (
 id int not null auto_increment -- this column might be nice since your hash_codes might colide, and this will make deletes/updates easier
 key_id int -- this column becomes optional
 hash_code int
 value string/varchar/int...
)

--

1
ответ дан 3 December 2019 в 01:39
поделиться

Создайте обновляемые представления!. Также проверьте это на пример.

1
ответ дан 3 December 2019 в 01:39
поделиться
Другие вопросы по тегам:

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