написание специальной базы данных, которая подходит для одной цели
Полагаю, вы имеете в виду собственную систему управления базами данных,
У меня много трудностей, когда я понимаю, почему это когда-нибудь понадобится.
Datasbes и таблицы, как и обычные базы данных. Но у меня нет колонок. Каждая запись может иметь свои собственные столбцы, кроме идентификатора
Это не очень хорошая причина для того, чтобы подвергать себя (и своих пользователей) большой боли и усилиям.
Я мог бы использовать MySQL ID | сериализованные данные ... но тогда очень весело искать определенный параметр в записи
Так что же не так с полностью полиморфной моделью, реализованной поверх реляционной базы данных:
CREATE TABLE relation (
id INTEGER NOT NULL auto_increment,
....
PRIMARY KEY (id)
);
CREATE TABLE col_string (
relation_id NOT NULL /* references relation.id */
name VARCHAR(20),
val_string VARCHAR(40),
PRIMARY KEY (relation_id, name)
);
CREATE TABLE col_integer (
relation_id NOT NULL /* references relation.id */
name VARCHAR(20),
val_integer INTEGER,
PRIMARY KEY (relation_id, name)
);
CREATE TABLE col_float (
relation_id NOT NULL /* references relation.id */
name VARCHAR(20),
val_float INTEGER,
PRIMARY KEY (relation_id, name)
);
... и таблицы для больших двоичных объектов, дат и т. Д.
Или если масштабируемость не является большой проблемой ....
CREATE TABLE all_cols (
relation_id NOT NULL /* references relation.id */
name VARCHAR(20),
ctype ENUM('string','integer','float',...),
val_string VARCHAR(40),
val_integer INTEGER,
val_float INTEGER,
...
PRIMARY KEY (relation_id, name)
);
Да, вставка и выбор 'строк' сложнее, чем для обычной реляционной таблицы, но намного проще, чем написание собственной СУБД с нуля. И вы можете обернуть большую часть функциональности в хранимых процедурах. Описанный метод также легко сопоставляется с базой данных NoSQL.