Если это только 30 свойств, я бы рекомендовал просто создать 30 столбцов. Это не слишком много для современной базы данных.
Но я бы предположил, что если у вас сегодня 30 объектов, вы будете изобретать новые свойства с течением времени, и количество столбцов будет расти. Реструктуризация таблицы для добавления столбцов каждый день может занять много времени, так как вы получаете много строк.
Альтернативное решение - в этом блоге вы найдете отличное решение для хранения большого количества динамических атрибутов без схемы: Как FriendFeed использует MySQL .
Соберите все свойства в некотором формате и сохраните их в одном столбце TEXT. Формат является полуструктурированным, то есть ваше приложение может разделять свойства при необходимости, но вы также можете добавлять больше в любое время или даже иметь разные свойства для строки. XML, YAML или JSON являются примерами форматов или некоторых форматов сериализации объектов, поддерживаемых языком кода вашего приложения.
CREATE TABLE Users (
user_id SERIAL PRIMARY KEY,
user_proerties TEXT
);
Это затрудняет поиск заданного значения в заданном свойстве. Таким образом, в дополнение к столбцу TEXT, создайте вспомогательную таблицу для каждого свойства, которое вы хотите найти для поиска, с двумя столбцами: значениями данного свойства и внешним ключом к основной таблице, где это конкретное значение найдено. Теперь у вас есть возможность индексировать столбец, чтобы поиск был быстрым.
CREATE TABLE UserBirthdate (
user_id BIGINT UNSIGNED PRIMARY KEY,
birthdate DATE NOT NULL,
FOREIGN KEY (user_id) REFERENCES Users(user_id),
KEY (birthdate)
);
SELECT u.* FROM Users AS u INNER JOIN UserBirthdate b USING (user_id)
WHERE b.birthdate = '2001-01-01';
Это означает, что когда вы вставляете или обновляете строку в Users, вам также необходимо вставить или обновить каждую из ваших вспомогательных таблиц, чтобы синхронизировать ее с вашими данными. Это может перерасти в сложную рутинную работу, если вы добавите дополнительные вспомогательные таблицы.