Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Шаблон за проектиране за персонализирани полета в релационна база данни

Избягвайте въведените низови данни, като замените VALUE с NUMBER_VALUE , DATE_VALUE , STRING_VALUE . Тези три типа са достатъчно добри през повечето време. Можете да добавите XMLTYPE и други фантастични колони по-късно, ако са необходими. А за Oracle използвайте VARCHAR2 вместо CHAR, за да спестите място.

Винаги се опитвайте да съхранявате стойностите като правилния тип. Вродените типове данни са по-бързи, по-малки, по-лесни за използване и по-безопасни.

Oracle има система с общи типове данни (ANYTYPE, ANYDATA и ANYDATASET), но тези типове са трудни за използване и трябва да се избягват в повечето случаи.

Архитектите често смятат, че използването на едно поле за всички данни прави нещата по-лесни. Това улеснява генерирането на красиви снимки на модела на данни, но прави всичко останало по-трудно. Помислете за тези проблеми:

  1. Не можете да правите нищо интересно с данни, без да знаете типа. Дори за показване на данни е полезно да знаете типа, за да оправдаете текста. В 99,9% от случаите на използване ще бъде очевидно за потребителя коя от 3-те колони е уместна.
  2. Разработването на безопасни за типа заявки срещу данни с низов тип е болезнено. Например, да приемем, че искате да намерите „Дата на раждане“ за хора, родени през това хилядолетие:

    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';
    

    Не искате да казвате на всеки разработчик да пише своите заявки по този начин.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 11 начина за връщане на чужди ключове в база данни на SQL Server с помощта на T-SQL

  2. T-SQL:проверка за имейл формат

  3. PHP извиква скрипт за архивиране на база данни на sqlserver, архивен файл е създаден и след това изтрит

  4. CLR строга сигурност на SQL Server 2017

  5. Грешка 'datetime2' при използване на структура на обект в VS 2010 .net 4.0