Czy adres e-mail jest złym kandydatem na adres podstawowy w porównaniu z automatycznym zwiększaniem liczb?
Nasza aplikacja internetowa wymaga, aby adres e-mail był unikalny w systemie. Pomyślałem więc o użyciu adresu e-mail jako klucza podstawowego. Jednak mój kolega sugeruje, że porównanie ciągów będzie wolniejsze niż porównanie liczb całkowitych.
Czy to ważny powód, aby nie używać wiadomości e-mail jako klucza podstawowego?
Używamy PostgreSQL
.
sql
database
database-design
postgresql
Robert
źródło
źródło
Odpowiedzi:
Porównanie ciągów jest wolniejsze niż porównywanie int. Nie ma to jednak znaczenia, jeśli po prostu pobierzesz użytkownika z bazy danych przy użyciu adresu e-mail. Ma to znaczenie, jeśli masz złożone zapytania z wieloma połączeniami.
Jeśli przechowujesz informacje o użytkownikach w wielu tabelach, kluczami obcymi do tabeli użytkowników będzie adres e-mail. Oznacza to, że przechowujesz adres e-mail wiele razy.
źródło
Zwrócę również uwagę, że e-mail to zły wybór, aby stworzyć unikalne pole, ponieważ ludzie, a nawet małe firmy, mają wspólny adres e-mail. Podobnie jak numery telefonów, e-maile mogą zostać ponownie wykorzystane. [email protected] może z łatwością należeć do Johna Smitha rok, a Julii Smith dwa lata później.
Innym problemem związanym z wiadomościami e-mail jest to, że często się zmieniają. Jeśli dołączasz do innych tabel z tym kluczem, musisz także zaktualizować inne tabele, co może być dość dużym spadkiem wydajności, gdy cała firma kliencka zmienia swoje e-maile (co widziałem).
źródło
klucz podstawowy powinien być unikalny i stały
adresy e-mail zmieniają się jak pory roku. Przydatny jako klucz pomocniczy do wyszukiwania, ale zły wybór klucza podstawowego.
źródło
Wady używania adresu e-mail jako klucza podstawowego:
Wolniej podczas łączenia.
Każdy inny rekord z zaksięgowanym kluczem obcym ma teraz większą wartość, zajmując więcej miejsca na dysku. (Biorąc pod uwagę dzisiejszy koszt miejsca na dysku, jest to prawdopodobnie trywialny problem, z wyjątkiem tego, że odczyt zajmuje teraz więcej czasu. Patrz nr 1).
Adres e-mail może ulec zmianie, co wymusza aktualizację wszystkich rekordów używających go jako klucza obcego. Ponieważ adres e-mail nie zmienia się tak często, problem z wydajnością jest prawdopodobnie niewielki. Większy problem polega na tym, że musisz go zapewnić. Jeśli musisz napisać kod, jest to więcej pracy i wprowadza możliwość błędów. Jeśli silnik bazy danych obsługuje „kaskadę aktualizacji”, jest to drobny problem.
Zalety używania adresu e-mail jako klucza podstawowego:
Możesz być w stanie całkowicie wyeliminować niektóre złączenia. Jeśli wszystko, czego potrzebujesz z „rekordu głównego”, to adres e-mail, to przy abstrakcyjnym kluczu całkowitym musisz wykonać połączenie, aby go odzyskać. Jeśli klucz to adres e-mail, oznacza to, że już go masz, a przyłączenie jest niepotrzebne. To, czy ci to pomoże, zależy od częstotliwości tej sytuacji.
Podczas wykonywania zapytań ad hoc człowiek może łatwo zobaczyć, do jakiego wzorca się odnosi. Może to być bardzo pomocne podczas próby śledzenia problemów z danymi.
I tak prawie na pewno będziesz potrzebować indeksu na adres e-mail, więc uczynienie go kluczem podstawowym eliminuje jeden indeks, poprawiając w ten sposób wydajność wstawiania, ponieważ teraz mają tylko jeden indeks do aktualizacji zamiast dwóch.
Moim skromnym zdaniem, tak czy inaczej, nie jest to zwykły trzask. Wolę używać kluczy naturalnych, gdy jest dostępny praktyczny, ponieważ są one po prostu łatwiejsze w użyciu, a wady w większości przypadków nie mają większego znaczenia.
źródło
Jest całkiem źle. Załóżmy, że jakiś dostawca poczty e-mail przestaje działać. Użytkownicy będą wtedy chcieli zmienić swój adres e-mail. Jeśli użyłeś e-maila jako klucza podstawowego, wszystkie klucze obce dla użytkowników będą duplikować ten e-mail, co bardzo trudno zmienić ...
... i nawet nie zacząłem mówić o kwestiach dotyczących wydajności.
źródło
Nie wiem, czy to może być problem w twojej konfiguracji, ale w zależności od RDBMS w wartościach kolumn może być rozróżniana wielkość liter . Dokumenty PostgreSQL mówią: „Jeśli zadeklarujesz kolumnę jako UNIQUE lub PRIMARY KEY, w niejawnie generowanym indeksie rozróżniana jest wielkość liter”. Innymi słowy, jeśli zaakceptujesz dane wejściowe użytkownika do wyszukiwania w tabeli z e-mailem jako kluczem podstawowym, a użytkownik poda „[email protected]”, nie znajdziesz „[email protected]”.
źródło
Wydaje się, że nikt nie wspomniał o możliwym problemie, że adresy e-mail można uznać za prywatne. Jeśli adres e-mail jest kluczem podstawowym, najprawdopodobniej będzie wyglądał adres URL strony profilu
..../Users/[email protected]
. Co jeśli nie chcesz ujawniać adresu e-mail użytkownika? Trzeba by znaleźć inny sposób identyfikacji użytkownika, na przykład za pomocą unikalnej wartości całkowitej, aby uzyskać podobne adresy URL..../Users/1
. Ostatecznie otrzymałeś unikalną wartość całkowitą.źródło
Na poziomie logicznym e-mail jest naturalnym kluczem. W fizycznym poziomie , biorąc pod uwagę, że korzystasz z relacyjnej bazy danych, klucz naturalny nie pasuje do klucza podstawowego. Powodem są głównie problemy z wydajnością wspomniane przez innych.
Z tego powodu projekt można dostosować. Klucz naturalny staje się kluczem alternatywnym (UNIQUE, NOT NULL), a kluczem zastępczym / sztucznym / technicznym jest klucz podstawowy, który może być w twoim przypadku automatyczną inkrementacją.
zapytał systempuntoout,
Po to jest kaskadowanie .
Kolejny powód używania numerycznego klucza zastępczego jako klucza podstawowego jest związany ze sposobem indeksowania na Twojej platformie. Na przykład w InnoDB MySQL wszystkie indeksy w tabeli mają wstępnie przypisany klucz podstawowy, więc chcesz, aby PK był tak mały, jak to możliwe (ze względu na szybkość i rozmiar). Również z tym związane, InnoDB jest szybszy, gdy klucz podstawowy jest przechowywany w sekwencji, a łańcuch nie pomoże.
Inną rzeczą, którą należy wziąć pod uwagę, używając łańcucha jako klucza alternatywnego, jest to, że użycie skrótu rzeczywistego łańcucha, który chcesz, może być szybsze, pomijając takie rzeczy, jak wielkie i małe litery niektórych liter. (Właściwie wylądowałem tutaj, szukając referencji, która potwierdzi to, co właśnie powiedziałem; wciąż szukam ...)
źródło
Tak, to zły klucz podstawowy, ponieważ użytkownicy będą chcieli zaktualizować swoje adresy e-mail.
źródło
tak, lepiej jest zamiast tego użyć liczby całkowitej. możesz również ustawić kolumnę e-mail jako unikalne ograniczenie.
lubię to:
źródło
Innym powodem, dla którego klucz podstawowy liczby całkowitej jest lepszy, jest odniesienie się do adresu e-mail w innej tabeli. Jeśli sam adres jest kluczem podstawowym, to w innej tabeli musisz go użyć jako klucza. Dlatego przechowujesz adresy e-mail wiele razy.
źródło
Nie znam się zbytnio na postgresie. Klucze podstawowe to duży temat. Widziałem kilka doskonałych pytań i odpowiedzi na tej stronie (stackoverflow.com).
Myślę, że możesz mieć lepszą wydajność, mając numeryczny klucz podstawowy i użyć UNIKALNEGO INDEKSU w kolumnie e-mail. Wiadomości e-mail mają różną długość i mogą nie być odpowiednie dla indeksu klucza podstawowego.
trochę lektury tu i tutaj.
źródło
Osobiście nie używam żadnych informacji na temat klucza podstawowego podczas projektowania bazy danych, ponieważ jest bardzo prawdopodobne, że będę musiał później zmienić jakieś informacje. Jedynym powodem, dla którego podaję klucz podstawowy, jest wygoda wykonywania większości operacji SQL po stronie klienta, a moim wyborem był zawsze automatyczny przyrost liczby całkowitej.
źródło
Twój kolega ma rację: użyj liczby całkowitej autoinkrementacji dla klucza podstawowego.
Możesz wdrożyć unikalność wiadomości e-mail na poziomie aplikacji lub możesz oznaczyć kolumnę adresu e-mail jako unikalną i dodać indeks do tej kolumny.
Dodanie pola jako unikalnego będzie kosztować porównanie ciągów tylko podczas wstawiania do tej tabeli, a nie podczas wykonywania połączeń i sprawdzania ograniczeń klucza obcego.
Oczywiście należy pamiętać, że dodanie jakichkolwiek ograniczeń do aplikacji na poziomie bazy danych może spowodować, że aplikacja stanie się nieelastyczna. Zawsze rozważaj, zanim dowolne pole będzie „unikatowe” lub „niepuste” tylko dlatego, że Twoja aplikacja musi być unikalna lub niepusta.
źródło
Użyj GUID jako klucza podstawowego ... w ten sposób możesz wygenerować go ze swojego programu, kiedy wykonasz INSERT i nie musisz otrzymywać odpowiedzi z serwera, aby dowiedzieć się, jaki jest klucz podstawowy. Będzie również unikatowy dla wszystkich tabel i baz danych i nie musisz się martwić, co się stanie, jeśli pewnego dnia obetniesz tabelę, a automatyczny przyrost zostanie zresetowany do 1.
źródło
Wiem, że to trochę spóźniony wpis, ale chciałbym dodać, że ludzie porzucają konta e-mail, a usługodawcy odzyskują adres, umożliwiając innym osobom korzystanie z niego.
Jak zauważył @HLGEM, „[email protected] może z łatwością należeć do Johna Smitha rok, a Julii Smith dwa lata później”. w takim przypadku, jeśli John Smith chce twojej usługi, musisz albo odmówić użycia jego adresu e-mail, albo usunąć wszystkie dane dotyczące Julii Smith.
Jeśli musisz usunąć zapisy, które odnoszą się do historii finansowej firmy, w zależności od lokalnych przepisów, możesz znaleźć się w gorącej wodzie.
Dlatego nigdy nie użyłbym danych, takich jak adresy e-mail, numery rejestracyjne itp., Jako kluczy podstawowych, ponieważ bez względu na to, jak wyjątkowe wydają się one poza twoją kontrolą i mogą stanowić ciekawe wyzwania, z którymi możesz nie mieć czasu.
źródło
Konieczne może być rozważenie wszelkich obowiązujących przepisów dotyczących regulacji danych. Adres e-mail to dane osobowe, a jeśli na przykład Twoi użytkownicy są obywatelami UE, zgodnie z RODO mogą nakazać Ci usunięcie ich danych z twoich danych (pamiętaj, że ma to zastosowanie niezależnie od kraju, w którym mieszkasz).
Jeśli chcesz zachować sam rekord w bazie danych ze względu na integralność referencyjną lub ze względów historycznych, takich jak audyt, użycie klucza zastępczego pozwoliłoby Ci na zerowanie wszystkich pól danych osobowych. Nie jest to oczywiście takie łatwe, jeśli ich dane osobowe są kluczem podstawowym
źródło
możesz zwiększyć wydajność za pomocą liczb całkowitych klucza podstawowego.
źródło
powinieneś użyć liczbowego klucza podstawowego. jeśli potrzebujesz, aby kolumna e-mail była unikalna, dlaczego po prostu nie ustawisz indeksu unikatowego dla tej kolumny?
źródło
Jeśli jako klucz podstawowy masz wartość inną niż int, wstawianie i pobieranie będzie bardzo powolne w przypadku dużych danych.
źródło
klucz podstawowy należy wybrać atrybut statyczny. Ponieważ adresy e-mail nie są statyczne i mogą być współużytkowane przez wielu kandydatów, więc używanie ich jako klucza podstawowego nie jest dobrym pomysłem. Ponadto adresy e-mail są ciągami zwykle o określonej długości, które mogą być większe niż unikatowe identyfikatory, których chcielibyśmy użyć [len (adres_adresu)> len (unikalny_id)], więc wymagałoby to więcej miejsca, a nawet najgorsze, są przechowywane wielokrotnie jako klucz obcy . W konsekwencji doprowadzi to do pogorszenia wydajności.
źródło
To zależy od stołu. Jeśli wiersze w tabeli reprezentują adresy e-mail, to adres e-mail jest najlepszym identyfikatorem. Jeśli nie, to adres e-mail nie jest dobrym identyfikatorem.
źródło
Jeśli po prostu wymagasz, aby wiadomość e-mail była unikalna, możesz po prostu utworzyć unikalny indeks z tą kolumną.
źródło
Adres e-mail jest dobrym unikalnym kandydatem na indeks, ale nie w przypadku klucza podstawowego, jeśli jest to klucz podstawowy, nie będzie można na przykład zmienić adresu e-mail kontaktu. Myślę, że twoje zapytania dotyczące łączenia również będą wolniejsze.
źródło
nie używaj adresu e-mail jako klucza podstawowego, zachowaj adres e-mail jako unikalny, ale nie używaj go jako klucza podstawowego, użyj identyfikatora użytkownika lub nazwy użytkownika jako klucza podstawowego
źródło