Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wzorzec projektowy dla pól niestandardowych w relacyjnej bazie danych

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:

  1. 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.
  2. 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 sposoby na usunięcie zduplikowanych wierszy w SQL Server, ignorując klucz podstawowy

  2. Ogranicz liczbę wierszy zwracanych w zapytaniu programu SQL Server za pomocą klauzuli TOP

  3. Jakie jest najlepsze narzędzie do porównania dwóch baz danych SQL Server (schematu i danych)?

  4. Instalacja klastra pracy awaryjnej serwera SQL -1

  5. Czy posiadanie „LUB” w warunku INNER JOIN to zły pomysł?