Я, как художник, так вижу
[Tests]
Id | Name | DateCreate | IsDeleted ну и еще, какие вам там надо атрибуты для хранения списка тестов
[Questions]
Id | TestId | QuestionText | AnswerText | IsDeleted + свои атрибуты, какие надо
[Answers]
Id | QuestionId | AnswerText | IsCorrect (является ли ответ правильным или просто вариант) | IsDeleted и т.д.
Как будет работать:
1. берем тест
2. берем N-ый вопрос для этого теста из таблицы вопросов
3. берем K ответов для N-ого вопроса. Варианта 3:
- К = 0. Ответов в таблице нет - значит вопрос открытый, без вариантов. Сравнивать введенный ответ нужно будет со значением в [Questions].[AnswerText]
- К>1. Ответы есть и правильных (IsCorrect) только один - значит нужно показывать radio
- К>1. Ответы есть и правильных (IsCorrect) больше одного - показываем чек боксы
UPD: прочитал ваш коммент
Кажется, я понял вас. Давайте, мой пример, а вы скажете, то или не то.
Интернет магазин электроники. У смартфонов свойства (память, экран, емкость батареи), а у пылесосов (мощность, длина провода, количество насадок). Объекты схожи (товары), но свойства разные и разное количество
Я так делал:
[Item] --товар
Id | Name | CategoryId | Cost | и т.д.
[PropTypes] --виды свойств
Id | Name | Measure (единица измерения, которая будет подписываться. Типа "Мб", "Вт", "Л", "км/ч") и т.д.
[ItemProps] --свойства, которыми обладает товар
Id | ItemId | typeId | и т.д.
[PropValues] - значения свойств
Id | PropId | numValue | textValue | boolValue | dateValue
Можно, конечно PropValues распилить на 4 таблицы, и каждый тип хранить отдельно. Но можно и так. Либо триггер написать, что заполнено может быть только одно поле из 4х (numValue | textValue | boolValue | dateValue).
Либо в коде это учитывать (менее предпочтительно)