Często w tabeli, która nie ma naturalnego klucza, nadal przydatne jest, aby użytkownicy mogli mieć unikatowo wygenerowany identyfikator. Jeśli tabela ma zastępczy klucz podstawowy (a w takim przypadku na pewno byś się tego spodziewał), czy klucz ten powinien zostać udostępniony użytkownikowi, czy też powinno się w tym celu użyć innego pola?
Jednym z powodów, dla których nie należy ujawniać klucza zastępczego jest to, że teraz nie można wykonywać operacji, które zachowują związek między rekordami, ale zmieniać wartości kluczy, takie jak niektóre rodzaje usuwania / ponownego wstawiania, wiele metod kopiowania danych z jednej bazy danych do inny itp.
Główną zaletą ujawnienia klucza zastępczego jest prostota korzystania z pola, które i tak masz.
W jakich okolicznościach lepiej jest bezpośrednio udostępniać klucz zastępczy użytkownikom?
Odpowiedzi:
Musisz być przygotowany na każdy identyfikator, który zostanie ujawniony użytkownikom / klientom wymagającym zmiany, a zmiana tożsamości wiersza w bazie danych i propagowanie tej zmiany do wszystkich kluczy obcych wymaga jedynie przerwania danych.
Jeśli dane nie mają naturalnego klucza biznesowego, możesz dodać dodatkowe pole dla „identyfikatora biznesowego”. Należy to zoptymalizować pod kątem procesów, w których jest używany. Wprowadzanie za pomocą klawiatury telefonicznej oznacza tylko cyfrę. Przez telefon / środki werbalne unikaj podobnych dźwięków (B / D, M / N itp.). Możesz nawet wygenerować automatycznie łatwą do zapamiętania frazę („zielona galaretka”).
Skutkuje to tym, że firma może później zmienić sposób, w jaki chcą odwoływać się do rekordów, a jedyną zmianą schematu danych jest albo dodanie nowej kolumny dla tego stylu identyfikatora, albo przekształcenie już istniejących identyfikatorów. Zmiana nie rozprzestrzenia się w całej bazie danych, a nadal masz jeden identyfikator (zastępczy), który jest ważny w czasie.
Krótko mówiąc, unikałbym udostępniania użytkownikom kluczy zastępczych. Jak wskazują komentarze, klucze zastępcze prawie nigdy nie powinny się zmieniać. I odwrotnie, firmy chcą wszystko zmienić. Jeśli klucz zastępczy zostanie ujawniony, to tylko kwestia czasu, zanim firma będzie chciała go zmienić.
Na marginesie, kiedy mówię tutaj „ujawniając”, mam na myśli dać klucz użytkownikowi, oczekując, że użyje go bezpośrednio (jak zadzwonienie w celu wsparcia z numerem zamówienia).
źródło
W niektórych przypadkach klucze zastępcze są oczekiwane i mają sens dla użytkowników. Moim ulubionym przykładem jest „numer zamówienia”. Numer zamówienia nie jest tak naprawdę kluczem naturalnym: kluczem naturalnym może być znacznik czasu plus użytkownik, a może nawet więcej, jeśli oczekujesz, że użytkownicy wygenerują więcej niż jedno zamówienie w ramach szczegółowości twojego znacznika czasu.
Niemniej użytkownicy rozumieją i oczekują wygody numeru zamówienia. Jeśli poinformujesz użytkowników o nich, nie zaszkodzi i zyskasz na wartości.
Z drugiej strony niektóre klucze zastępcze nie mają sensu dla użytkownika. Jasne, moja firma ubezpieczeń zdrowotnych ma jakiś klucz zastępczy, który identyfikuje mnie na podstawie identyfikatora członka, daty urodzenia, przewoźnika itp., Ale nie dbam o to, dbam o informacje na mojej karcie (które często zawierają identyfikatory u mojego pracodawcy i nie są wyjątkowe w całym wszechświecie ... Stąd klucz zastępczy w firmie ubezpieczeniowej).
źródło
Powinieneś ujawniać klucz zastępczy tylko wtedy, gdy jest to poprawnie wygenerowany identyfikator GUID / UUID *. Ujawnianie sekwencyjnych kluczy zastępczych jest numerem 4 w kwestiach bezpieczeństwa 10 najlepszych OWASP.
* W praktyce najlepiej założyć, że nie został poprawnie wygenerowany do tych celów, chyba że wiesz, że został utworzony przez kryptograficznie bezpieczny generator liczb losowych lub pseudolosowych.
źródło
Jeśli tabela nie ma klucza naturalnego, klucze zastępcze dopuszczają takie wiersze.
Nazwałbym te sztuczne klucze zamiast kluczy zastępczych, ale to rozróżnienie nie jest ważne w przypadku tego pytania.
Teraz, zakładając, że istnieją ważne dane odnoszące się do tych kluczy zastępczych poprzez klucze obce, w jaki sposób użytkownicy końcowi wiedzą, który wiersz zaktualizować, jeśli nie znają wartości kluczy zastępczych?
źródło
Słowami laika:
źródło
powinieneś ujawniać WYŁĄCZNIE pole użytkownikowi, który dostarcza użyteczne informacje użytkownikowi, bezpośrednio lub w zgłoszeniu usterki.
i odwrotnie, należy ZAWSZE ujawniać „zastępcze klucze podstawowe”, gdy są one głównym sposobem identyfikacji rekordu (prostego lub złożonego) dla interakcji, którą wykonuje użytkownik.
źródło
Nie powinno mieć znaczenia, czy ujawnisz klucze czy nie użytkownikowi końcowemu. Twoja aplikacja powinna wykonać niezbędną autoryzację, tak aby na przykład znajomość identyfikatora zamówienia nie pozwalała na dostęp do czegoś, do czego normalnie nie mieliby dostępu.
zastrzeżenie: zakłada to aplikację internetową lub n-warstwową, w której autoryzacja po stronie serwera jest możliwa / wykonalna. Jeśli masz aplikację VB, która bezpośrednio wykonuje SQL, jest to zupełnie inny problem.
źródło