Избягвайте въведените низови данни, като замените VALUE
с NUMBER_VALUE
, DATE_VALUE
, STRING_VALUE
. Тези три типа са достатъчно добри през повечето време. Можете да добавите XMLTYPE и други фантастични колони по-късно, ако са необходими. А за Oracle използвайте VARCHAR2 вместо CHAR, за да спестите място.
Винаги се опитвайте да съхранявате стойностите като правилния тип. Вродените типове данни са по-бързи, по-малки, по-лесни за използване и по-безопасни.
Oracle има система с общи типове данни (ANYTYPE, ANYDATA и ANYDATASET), но тези типове са трудни за използване и трябва да се избягват в повечето случаи.
Архитектите често смятат, че използването на едно поле за всички данни прави нещата по-лесни. Това улеснява генерирането на красиви снимки на модела на данни, но прави всичко останало по-трудно. Помислете за тези проблеми:
- Не можете да правите нищо интересно с данни, без да знаете типа. Дори за показване на данни е полезно да знаете типа, за да оправдаете текста. В 99,9% от случаите на използване ще бъде очевидно за потребителя коя от 3-те колони е уместна.
-
Разработването на безопасни за типа заявки срещу данни с низов тип е болезнено. Например, да приемем, че искате да намерите „Дата на раждане“ за хора, родени през това хилядолетие:
select * from ReportFieldValue join ReportField on ReportFieldValue.ReportFieldid = ReportField.id where ReportField.name = 'Date of Birth' and to_date(value, 'YYYY-MM-DD') > date '2000-01-01'
Можете ли да забележите грешката? Горната заявка е опасна, дори ако сте съхранили датата в правилния формат и много малко разработчици знаят как правилно да я коригират. Oracle има оптимизации, които затрудняват налагането на конкретен ред на операции. Ще ви трябва заявка като тази, за да сте безопасни:
select * from ( select ReportFieldValue.*, ReportField.* --ROWNUM ensures type safe by preventing view merging and predicate pushing. ,rownum from ReportFieldValue join ReportField on ReportFieldValue.ReportFieldid = ReportField.id where ReportField.name = 'Date of Birth' ) where to_date(value, 'YYYY-MM-DD') > date '2000-01-01';
Не искате да казвате на всеки разработчик да пише своите заявки по този начин.