Вы хотите инкапсулировать данные таким образом, чтобы каждая таблица содержала только информацию, непосредственно связанную с тем, с чем она должна иметь дело. Создайте таблицы связей, чтобы обеспечить связи между различными наборами данных (в данном случае, пользователями и объектами).
Я бы создал следующие таблицы:
Пользователь - базовая информация пользователя: логин, пароль, идентификатор пользователя, все, что вам нужно.
Объект - объект для оценки: его имя / идентификатор и атрибуты.
Feature - таблица, описывающая тип функции, с каким-либо именем / идентификатором функции. Это может начаться с ваших трех основных типов, но вы всегда можете расширить / изменить это. Вы также можете настроить, какие функции будут доступны каждому объекту для оценки.
ObjectFeature - таблица связей для объекта и объекта. Содержит первичный ключ каждой таблицы, создавая отношение «многие ко многим» между ними.
UserRating - еще одна таблица связей между ObjectFeature и пользователем. Содержит первичные ключи этих двух таблиц, а также присвоенный рейтинг.
С реляционной точки зрения это лучший способ организации данных, чем то, что вы представили. Благодаря своей конструкции он ясно показывает, как каждый набор данных связан, и делает расширяемость (например, добавление дополнительных функций для оценки, когда разные объекты имеют различные функции для оценки) намного чище.