2009-06-26 9 views
5

W kodzie można określić globalnie dostępne stałe/wyliczenia/itd., Po czym można je ponownie wykorzystać za pośrednictwem aplikacji. Daje to możliwość używania znaczących nazw takich jak "Mazda" zamiast takich jak "2".Pozbywanie się liczb "magicznych" w SQL Server

Chcielibyśmy zrobić to samo z naszymi procedurami przechowywanymi SQL Server, ale nie jesteśmy pewni najlepszego sposobu implementacji tego.

np poniższych tabelach (Przysłowiowy schematu samochodów):

Car  ManufacturerId 
350Z  1 
Hilux  2 
Yaris  2 

ManufacturerId Name 
1    Nissan 
2    Toyota 

Więc zamiast pisać

SELECT * FROM Car WHERE ManufacturerId = 1 -- Nissan 

Chcielibyśmy napisać coś jak

SELECT * FROM Car WHERE ManufacturerId = @Nissan 

jedno ograniczenie mamy to, że nie możemy polegać na Manufacturer.Name pozostaje takie samo przez całe życie aplikacji. Zrobiliśmy pomyśleć o kolumnę „kod”, który nigdy się nie zmienia i sprzężenia są spojrzał tak:

SELECT * 
FROM Car c 
    INNER JOIN Manufacturer m ON c.ManufacturerId = m.ManufacturerId 
WHERE m.Code = 'Nissan' 

Jestem trochę niezdecydowany na ten temat, gdyż wykorzystuje dodatkowy dołączyć i porównań ciąg znaków, który może być błędnie napisane .

Jaki jest najlepszy sposób, aby to osiągnąć bez konieczności zadeklarowania zmiennych w każdej zapisanej procedurze?

Odpowiedz

4

Zrobiliśmy to kilka sposobów:

  • funkcji zdefiniowanej przez użytkownika, która zwraca „magiczną liczbę” według nazwy.
  • Użyj kolumny nchar (4) zamiast kolumny int i wymyśl trochę mniej nieodkrywalne kody. Więc Nissan będzie "NISN" zamiast 1. Trochę ładniejszy.
+0

Zabawia się z pierwszą sugestią, ale jest już za późno na drugą. Może następnym razem. –

+0

To, co sprawia problemy z tym problemem, polega na tym, że magiczna liczba zwykle odpowiada wyliczeniu w kodzie klienta. W pewnym momencie zepsujesz synchronizację zapytania SQL z wyliczeniem klienta. MS SQL Server oferuje tutaj bardzo schludny punkt integracji: można kodować UDF CLR, aby zwrócić wartość wyliczenia, zasadniczo wymuszając pewne bezpieczeństwo typu uruchomieniowego. Nadal musisz upewnić się, że twoje zapytania otrzymują nazwy wartości wyliczeniowych, jednak nigdy nie znalazłem sposobu obejścia tej części problemu. –

1

Nie trzeba przechowywać numerów w bazie danych. Są tam administratorzy DB, którzy wciąż kochają pomysł "naturalnych kluczy". Zamiast używać identyfikatora, po prostu używają klucza naturalnego, który jednoznacznie określa producenta. Często może to prowadzić do wielu podstawowych kluczy. Być może musisz mieć "Mazdę" Kanadę jako unikalny identyfikator producenta.

Osobiście nie lubię tej metody i wolę mieć unikalny identyfikator dla każdego identyfikowalnego obiektu przechowywanego w moich tabelach. Oznacza to utworzenie nowej tabeli, która jest odnośnikiem. 2, "Mazada". Następnie możesz utworzyć widok, który wyciągnie "Mazdę" w miejscu, w którym znajduje się 2 w bazie danych, a następnie uruchom zapytanie względem widoku. SELECT * od v_cars, gdzie producent = 'Mazda'

+0

Poza tym, że spóźniłem się na zmianę aranżacji, zgadzam się z tobą, że w takich przypadkach nie używasz kluczy naturalnych, ponieważ ułatwia to używanie wyliczeń w kodzie. Podoba mi się pomysł widoku. –

Powiązane problemy