sql >> Databasteknik >  >> RDS >> Sqlserver

Designmönster för anpassade fält i relationsdatabasen

Undvik strängskrivna data genom att ersätta VALUE med NUMBER_VALUE , DATE_VALUE , STRING_VALUE . Dessa tre typer är bra nog för det mesta. Du kan lägga till XMLTYPE och andra snygga kolumner senare om de behövs. Och för Oracle, använd VARCHAR2 istället för CHAR för att spara utrymme.

Försök alltid att lagra värden som rätt typ. Inbyggda datatyper är snabbare, mindre, enklare att använda och säkrare.

Oracle har ett generiskt datatypsystem (ANYTYPE, ANYDATA och ANYDATASET), men dessa typer är svåra att använda och bör undvikas i de flesta fall.

Arkitekter tror ofta att det blir lättare att använda ett enda fält för all data. Det gör det lättare att skapa vackra bilder av datamodellen men det gör allt annat svårare. Tänk på dessa frågor:

  1. Du kan inte göra något intressant med data utan att känna till typen. Även för att visa data är det användbart att veta vilken typ som ska motivera texten. I 99,9 % av alluse-fallen kommer det att vara uppenbart för användaren vilken av de tre kolumnerna som är relevant.
  2. Det är smärtsamt att utveckla typsäkra frågor mot strängskrivna data. Låt oss till exempel säga att du vill hitta "födelsedatum" för personer som är födda under det här millenniet:

    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'
    

    Kan du upptäcka buggen? Ovanstående fråga är farlig, även om du har lagrat datumet i rätt format, och väldigt få utvecklare vet hur man rättar till det. Oracle har optimeringar som gör det svårt att tvinga fram en specifik operationsordning. Du behöver en fråga som denna för att vara säker:

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

    Du vill inte behöva säga åt alla utvecklare att skriva sina frågor på det sättet.



  1. PG COPY-fel:ogiltig indatasyntax för heltal

  2. söker programmässigt efter öppen anslutning i JDBC

  3. ClusterControl - Advanced Backup Management - PostgreSQL

  4. MySQL visa status - aktiva eller totala anslutningar?