Что эквивалентно типу данных MySQL Set в Oracle? - PullRequest
0 голосов
/ 30 ноября 2018

В MySQL мы можем использовать Set datatype для выбора нескольких значений для каждого столбца любой конкретной строки следующим образом:

CREATE TABLE `staff` ( `StaffID` int(5) NOT NULL AUTO_INCREMENT,
                  `Availability` set('Mon','Tue','Wed','Thur','Fri','SatAM','SatPM','Sun') DEFAULT NULL, 
                  PRIMARY KEY (`StaffID`))

Тогда я могу сделать,

INSERT INTO `staff` (`Availability`) VALUES ('Tue,Wed,SatPM')

Я пыталсянайти везде, но не смог найти подходящий тип данных для хранения нескольких выбранных опций, как указано выше в Oracle.Документация Oracle, кажется, показывает, что альтернативы для набора MySQL нет, но я не могу поверить, что у них его нет!Так может ли кто-нибудь помочь мне объяснить это?

Ссылка на документацию Oracle Оригинальная ссылка

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Ответ Сентинеля (который я проголосовал) касается вопроса в буквальном смысле.

Однако я собираюсь сделать шаг назад и, отвечая на вопрос, «как мне представить этот тип данных вOracle ", посоветуйте, что лучшим решением этой проблемы является , а не , эмулирующий тип данных.

Тип данных Set, возможно, является нарушением первой нормальной формы.Это не обязательно моральное суждение о его использовании;такие решения делают определенные запросы более легкими и / или более эффективными, а другие более сложными и / или менее эффективными.Но нормальные формы основаны на многолетнем опыте работы с RDBMS.Для широкого спектра приложений соблюдение первых трех нормальных форм является хорошим способом избежать проблем с балансом.

Нормализованное решение, которое может быть реализовано в Oracle (без перехода через циклы для эмуляции перечислений битовых полей).) может включать в себя таблицу Staff с идентификатором, таблицу AvailabilityCode со строкой для каждого отдельного значения в наборе и StaffAvailability, перекрестную ссылку между ними со строкой для каждого значения AvailabilityCode, которое вы хотитеассоциировать с идентификатором персонала.

0 голосов
/ 30 ноября 2018

В MySQL установленный тип данных является именованным битовым типом данных.В Oracle нет такового, хотя вы можете эмулировать его, если действительно хотите, используя ограниченный целочисленный тип данных:

CREATE TABLE staff (
    staffid INTEGER GENERATED BY DEFAULT AS IDENTITY ( START WITH 1 NOCACHE ORDER ) NOT NULL PRIMARY KEY
  , availability INTEGER CHECK ( availability BETWEEN 0 AND 256 )
);

. Вам нужно будет запомнить или создать функцию для сопоставления между значениями растрового изображения идней.

Другой вариант - использовать справочную таблицу:

create table availability as
with t1(id, mon, tue, wed, thu, fri, satam, satpm, sun) as (
select 0, 0, 0, 0, 0, 0, 0, 0, 0 from dual
union all
select id+1
     , sign(bitand(id+1,1))
     , sign(bitand(id+1,2))
     , sign(bitand(id+1,4))
     , sign(bitand(id+1,8))
     , sign(bitand(id+1,16))
     , sign(bitand(id+1,32))
     , sign(bitand(id+1,64))
     , sign(bitand(id+1,128))
  from t1 where id+1 <256
)
select * from t1;

alter table availability add primary key (id);

CREATE TABLE staff (
    staffid INTEGER GENERATED BY DEFAULT AS IDENTITY ( START WITH 1 NOCACHE ORDER ) NOT NULL PRIMARY KEY
  , availability INTEGER 
  , CONSTRAINT staff_avail_fk FOREIGN KEY ( availability ) REFERENCES availability ( id ) 
);
...