Unikaj danych wpisywanych łańcuchowo, zastępując VALUE
z NUMBER_VALUE
, DATE_VALUE
, STRING_VALUE
. Te trzy typy są wystarczająco dobre w większości przypadków. Możesz później dodać XMLTYPE i inne fantazyjne kolumny, jeśli będą potrzebne. A w przypadku Oracle użyj VARCHAR2 zamiast CHAR, aby zaoszczędzić miejsce.
Zawsze staraj się przechowywać wartości jako właściwy typ. Natywne typy danych są szybsze, mniejsze, łatwiejsze w użyciu i bezpieczniejsze.
Oracle ma ogólny system typów danych (ANYTYPE, ANYDATA i ANYDATASET), ale te typy są trudne w użyciu i w większości przypadków należy ich unikać.
Architekci często uważają, że używanie jednego pola dla wszystkich danych ułatwia sprawę. Ułatwia to generowanie ładnych zdjęć modelu danych, ale utrudnia wszystko inne. Rozważ te kwestie:
- Nie możesz zrobić nic ciekawego z danymi bez znajomości ich typu. Nawet do wyświetlania danych przydatna jest znajomość typu uzasadnienia tekstu. W 99,9% wszystkich przypadków będzie oczywiste dla użytkownika, która z 3 kolumn jest istotna.
-
Opracowywanie zapytań z bezpiecznymi typami dla danych wpisywanych łańcuchowo jest bolesne. Załóżmy na przykład, że chcesz znaleźć „Datę urodzenia” osób urodzonych w tym tysiącleciu:
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'
Czy widzisz błąd? Powyższe zapytanie jest niebezpieczne, nawet jeśli zapisałeś datę we właściwym formacie, a bardzo niewielu programistów wie, jak to naprawić. Oracle posiada optymalizacje, które utrudniają wymuszenie określonej kolejności operacji. Aby być bezpiecznym, potrzebujesz takiego zapytania:
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';
Nie chcesz, aby każdy programista pisał swoje zapytania w ten sposób.