Если набор примерных атрибутов был относительно статичным, то прагматичным решением, которое облегчит вашу жизнь в долгосрочной перспективе, будет option # 2 - это все атрибуты SAMPLE, поэтому все они должны быть в той же таблице.
Хорошо - вы могли бы собрать хорошую иерархию объектов базовых атрибутов с различными расширениями, но это будет больше проблем, чем стоит. Будь проще. Вы всегда можете собрать несколько видов подмножеств выборочных атрибутов.
Я бы выбрал вариант вашего варианта №3 только в том случае, если список примеров атрибутов был очень динамичным и ваши пользователи должны были иметь возможность создавать свои собственные поля.
С точки зрения реализации динамических пользовательских полей, вы можете сначала прочитать комментарии Тома Кайта к этому вопросу . Теперь Том может быть довольно настойчивым в своих взглядах, но я беру из его комментариев, что вы должны быть очень уверенными, что вам действительно нужна гибкость для того, чтобы ваши пользователи могли добавлять поля на лету, прежде чем делать это. , Если вам действительно нужно это сделать, не создавайте таблицу для каждого типа данных - это заходит слишком далеко - просто храните все в varchar2 стандартным способом и помечайте каждый атрибут соответствующим типом данных.
create table sample (
sample_id integer,
name varchar2(120 char),
constraint pk_sample primary key (sample_id)
);
create table attribute (
attribute_id integer,
name varchar2(120 char) not null,
data_type varchar2(30 char) not null,
constraint pk_attribute primary key (attribute_id)
);
create table sample_attribute (
sample_id integer,
attribute_id integer,
value varchar2(4000 char),
constraint pk_sample_attribute primary key (sample_id, attribute_id)
);
Теперь ... это выглядит злым, не так ли? Вы действительно хотите поехать туда?