Вы можете использовать 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"
Не оптимизируйте это, если Вы не имеете к. Какова средняя длина ключа? Эта таблица будет настолько большой это разве, все не впишутся в память Вашего сервера, если Вы реализуете его наивный путь? Я предложил бы реализовать его самый простой путь, измерил бы уровень и затем повторно реализовал бы, только если производительность является проблемой.
Если производительность является проблемой, то использование целочисленного ключа и отдельной таблицы является, вероятно, способом пойти (СОЕДИНЕНИЯ на целочисленных столбцах обычно быстрее, чем СОЕДИНЕНИЯ с помощью столбцов строки переменной длины). Но первое правило оптимизации является МЕРОЙ СНАЧАЛА - удостоверяются, что Ваш предположительно-оптимизированный-код на самом деле делает вещь выполненной быстрее.
Вы используете модель базы данных под названием Значение атрибута объекта. Это - распространенный способ сохранить пары ключ/значение в реляционной базе данных, но это имеет много слабых мест относительно нормализации базы данных и эффективности.
Да, дизайн таблицы, который Вы показали, является наиболее распространенным способом сделать это. В этом дизайне каждый атрибут каждого объекта вкладывает отличную строку Ваш 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';
Некоторые проблемы со Значением атрибута объекта:
В основном Значение атрибута объекта не является нормализованным проектированием баз данных.
Опция, которую может стоить исследовать, переваривает ключ с помощью SHA1 или MD5 прежде, чем вставить его в таблицу.
Это позволит Вам избавляться от справочной таблицы, но Вы не сможете выполнить итерации через ключи, вызывают его, только идет одним путем.
Это кажется мне как Вы, мог бы иметь пару проектных решений.
Выбор 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...
)
--
Создайте обновляемые представления!. Также проверьте это на пример.