Używać adresu e-mail jako klucza podstawowego?

Czy adres e-mail jest złym kandydatem do podstawowej w porównaniu do automatycznego zwiększania liczby?

Nasza aplikacja internetowa potrzebuje adresu e-mail, aby 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ównywanie ciągów będzie wolniejsze niż porównywanie liczb całkowitych.

Czy to ważny powód, aby nie używać poczty e-mail jako klucza podstawowego?

Używamy PostgreSQL.

Author: giannis christofakis, 2010-09-27

24 answers

Porównywanie łańcuchów jest wolniejsze niż porównywanie int. Nie ma to jednak znaczenia, jeśli po prostu pobierasz użytkownika z bazy danych za pomocą 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, kluczem obcym do tabeli użytkowników będzie adres e-mail. Oznacza to, że adres e-mail jest przechowywany wielokrotnie.

 264
Author: Sjoerd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 13:17:57

Zwrócę również uwagę, że e-mail jest złym wyborem, aby zrobić unikalne pole, są ludzie, a nawet małe firmy, które udostępniają adres e-mail. I podobnie jak numery telefonów, e-maile mogą być ponownie używane. [email protected] może łatwo należeć do Johna Smitha rok i Julii Smith dwa lata później.

Kolejny problem z e-mailami jest taki, że często się zmieniają. Jeśli łączysz się z innymi stołami z tym jako kluczem, będziesz musiał zaktualizować inne stoły, jak również, co może być dość hitem wydajności, gdy cała firma Klienta zmienia swoje e-maile(co widziałem.)

 165
Author: HLGEM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-22 19:24:24

Klucz główny powinien być Unikalny i stała

Adresy e-mail zmieniają się jak Pory roku. Przydatny jako klucz pomocniczy do wyszukiwania, ale kiepski wybór dla klucza podstawowego.

 93
Author: Steven A. Lowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 13:31:13

Wady używania adresu e-mail jako klucza podstawowego:

  1. Wolniej przy łączeniu.

  2. Każdy inny rekord z umieszczonym 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 stopnia, że zapis trwa dłużej. Patrz #1.)

  3. Adres e-mail może ulec zmianie, co wymusza aktualizację wszystkich rekordów używających go jako klucza obcego. Jako e-mail adres nie zmienia się tak często, problem z wydajnością jest prawdopodobnie niewielki. Większym problemem jest to, że musisz upewnić się, aby zapewnić go. Jeśli musisz napisać kod, jest to więcej pracy i wprowadza możliwość błędów. Jeśli twój silnik bazy danych obsługuje "on update cascade", jest to drobny problem.

Zalety używania adresu e-mail jako klucza podstawowego:

  1. Być może będziesz w stanie całkowicie wyeliminować niektóre połączenia. Jeśli wszystko, czego potrzebujesz od " mistrza record " to adres e-mail, a następnie za pomocą abstrakcyjnego klucza integer będziesz musiał wykonać połączenie, aby go odzyskać. Jeśli kluczem jest adres e-mail, to już go masz, a dołączenie jest niepotrzebne. To, czy ci to pomoże, zależy od tego, jak często pojawia się ta sytuacja.

  2. Kiedy wykonujesz zapytania ad hoc, łatwo człowiekowi zobaczyć, do którego rekordu głównego jest odwoływany. Może to być bardzo pomocne podczas próby wyśledzenia problemów z danymi.

  3. You almost z pewnością będzie potrzebował indeksu na adresie e-mail, więc uczynienie go kluczem podstawowym eliminuje jeden indeks, poprawiając w ten sposób wydajność wkładek, ponieważ teraz mają tylko jeden indeks do aktualizacji zamiast dwóch.

Moim skromnym zdaniem, to i tak nie jest slam-dunk. Wolę używać klawiszy naturalnych, gdy dostępny jest praktyczny, ponieważ są one po prostu łatwiejsze w obsłudze, a wady zazwyczaj nie mają większego znaczenia w większości przypadków.

 61
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 15:04:39

Jest bardzo źle. Załóżmy, że jakiś dostawca poczty e-mail kończy działalność. Użytkownicy będą chcieli zmienić swój adres e-mail. Jeśli użyłeś e-maila jako klucza podstawowego, wszystkie klucze obce dla użytkowników powieli ten e-mail, co sprawia, że jest to cholernie trudne do zmiany ...

... nawet nie zacząłem mówić o wydajności.

 11
Author: meriton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 13:23:27

Nie wiem, czy to może być problem w Twojej konfiguracji, ale w zależności od Twojego RDBMS wartości kolumn mogą być rozróżniane na wielkość liter. Dokumenty PostgreSQL mówią: "jeśli zadeklarujesz kolumnę jako klucz UNIQUE lub PRIMARY, domyślnie wygenerowany indeks uwzględnia wielkość liter". Innymi słowy, jeśli akceptujesz wpis użytkownika do wyszukiwania w tabeli z e-mailem jako kluczem podstawowym, a użytkownik zapewnia "[email protected]", nie znajdziesz "[email protected]".

 9
Author: xlttj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-28 06:33:57

Wydaje się, że nikt nie wspomniał o możliwym problemie, że adresy e-mail mogą być uważane za prywatne. Jeśli adres e-mail jest kluczem głównym, adres URL strony profilu najprawdopodobniej będzie wyglądał podobnie do ..../Users/[email protected]. Co zrobić, jeśli nie chcesz ujawniać adresu e-mail użytkownika? Musisz znaleźć inny sposób identyfikacji użytkownika, prawdopodobnie przez unikalną wartość całkowitą, aby utworzyć adresy URL takie jak ..../Users/1. Wtedy w końcu otrzymasz unikalną wartość całkowitą.

 9
Author: Simen Echholt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-03 10:45:04

W logiczny Poziom , e-mail jest kluczem naturalnym. Na poziomie fizycznym , biorąc pod uwagę, że używasz relacyjnej bazy danych, klucz naturalny nie pasuje dobrze do klucza podstawowego. Powodem są głównie kwestie wydajności wymienione przez innych.

Z tego powodu projekt można dostosować. Klucz naturalny staje się kluczem alternatywnym (unikalnym, nie NULL), a jako klucz podstawowy używasz klucza zastępczego/sztucznego/technicznego , który może być auto-przyrost w Twoim przypadku.

Systempuntoout,

Co jeśli ktoś chce zmienić swój adres e-mail? Zmienisz też wszystkie zagraniczne klucze?

Po to jest kaskadowanie .

Kolejny powód, aby używać numerycznego klucza zastępczego jako klucza podstawowego, jest związany z tym, jak indeksowanie działa na twojej platformie. Na przykład w InnoDB MySQL, wszystkie indeksy w tabeli mają wstępnie przypisany klucz główny, więc chcesz, aby PK był jak małe jak to możliwe (ze względu na szybkość i rozmiar). W związku z tym InnoDB jest szybszy, gdy klucz podstawowy jest przechowywany w sekwencji, a łańcuch znaków nie pomoże.

Inną rzeczą, którą należy wziąć pod uwagę przy użyciu ciągu jako klucza alternatywnego, jest to, że użycie skrótu rzeczywistego ciągu, który chcesz, może być szybsze, pomijając rzeczy takie jak małe i duże litery niektórych liter. (Faktycznie wylądowałem tutaj, szukając odniesienia, aby potwierdzić to, co właśnie powiedziałem; nadal Szukam...)

 7
Author: Rafa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-06 11:50:19

Tak, jest lepiej, jeśli zamiast tego użyjesz liczby całkowitej. możesz również ustawić kolumnę e-mail jako unikalne ograniczenie.

Tak:

CREATE TABLE myTable(
    id integer primary key,
    email text UNIQUE
);
 4
Author: ibram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 13:15:15

Tak, jest to zły klucz podstawowy, ponieważ użytkownicy będą chcieli zaktualizować swoje adresy e-mail.

 4
Author: Lone Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-03 02:00:50

Innym powodem, dla którego klucz podstawowy integer jest lepszy, jest odwołanie się do adresu e-mail w innej tabeli. Jeśli sam adres jest kluczem podstawowym, to w innej tabeli musisz użyć go jako klucza. Więc przechowujesz adresy e-mail wiele razy.

 3
Author: klew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 13:18:45

Nie jestem zbyt zaznajomiony z postgres. 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żywać unikalnego indeksu w kolumnie E-mail. E-maile mają zwykle różną długość i mogą nie być odpowiednie dla indeksu klucza głównego.

Trochę czytania tutaj i tutaj.

 3
Author: Saif Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:10

Twój kolega ma rację: użyj autoincrementing integer dla klucza głównego.

Możesz zaimplementować unikalność wiadomości e-mail na poziomie aplikacji lub oznaczyć kolumnę adresu e-mail jako unikalną i dodać indeks do tej kolumny.

Dodanie pola jako unique będzie kosztować porównanie ciągu znakó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 dodawanie jakichkolwiek ograniczeń do aplikacja na poziomie bazy danych może spowodować, że aplikacja stanie się nieelastyczna. Zawsze należy wziąć pod uwagę, zanim uczynisz jakiekolwiek pole "unikalne" lub "nie null" tylko dlatego, że aplikacja potrzebuje, aby było unikalne lub niepuste.

 2
Author: jrharshath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 13:19:00

Użyj GUID jako klucza głównego... w ten sposób możesz wygenerować go z programu podczas wstawiania i nie musisz otrzymywać odpowiedzi od serwera, aby dowiedzieć się, jaki jest klucz podstawowy. Będzie to również unikalne tabele accross i bazy danych i nie musisz się martwić o to, co się stanie, jeśli obetniesz tabelę pewnego dnia, a automatyczny przyrost zostanie zresetowany do 1.

 2
Author: JoelFan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 20:54:16

Osobiście nie używam żadnych informacji dla klucza podstawowego podczas projektowania bazy danych, ponieważ jest bardzo prawdopodobne, że będę musiał później zmienić jakiekolwiek informacje. Jedynym powodem, dla którego dostarczam klucz podstawowy, jest wygoda wykonywania większości operacji SQL po stronie klienta, a mój wybór do tego zawsze był automatycznym zwiększaniem typu integer.

 2
Author: tia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-28 02:42:59

Wiem, że to trochę spóźniony wpis, ale chciałbym dodać, że ludzie porzucają konta e-mail, a dostawcy usług odzyskują adres pozwalając innej osobie na korzystanie z niego.

Jak zauważył @HLGEM "[email protected] może łatwo należeć do Johna Smitha rok i Julii Smith dwa lata później."w takim przypadku, jeśli John Smith chce twojej usługi, musisz odmówić użycia jego adresu e-mail lub usunąć wszystkie zapisy dotyczące Julii Smith.

Jeśli musisz usunąć zapisy i odnoszą się do historii finansowej firmy w zależności od lokalnego prawa można znaleźć się w ciepłej wodzie.

Więc nigdy nie użyłbym danych takich jak adresy e-mail, tablice rejestracyjne itp. jako podstawowe klucze, ponieważ bez względu na to, jak wyjątkowy wydają się one poza kontrolą i może dostarczyć kilka ciekawych wyzwań, które mogą nie mieć czasu na radzenie sobie z.

 2
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-02 09:20:03

Możesz zwiększyć wydajność za pomocą klucza głównego integer.

 1
Author: xport,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 13:14:47

Powinieneś użyć klucza głównego integer. jeśli chcesz, aby kolumna e-mail była unikalna, dlaczego nie ustawisz po prostu unikalnego indeksu w tej kolumnie?

 1
Author: oezi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 13:16:12

Jeśli masz wartość non int jako klucz podstawowy, wstawianie i pobieranie będą bardzo powolne na dużych danych.

 1
Author: Amareswar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 14:37:52

To zależy od tabeli. Jeśli wiersze w tabeli reprezentują adresy e-mail, najlepszym identyfikatorem jest adres e-mail. Jeśli nie, email nie jest dobrym identyfikatorem.

 0
Author: Lajos Arpad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 19:07:05

Jeśli chodzi po prostu o to, aby email był unikalny, możesz po prostu utworzyć unikalny Indeks z tą kolumną.

 0
Author: Micah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 21:06:42

Email jest dobrym unikalnym kandydatem do indeksu, ale nie dla klucza podstawowego, jeśli jest to klucz podstawowy, nie będziesz w stanie zmienić na przykład adresu e-mail kontaktu. Myślę, że Twój querys będzie wolniejszy.

 0
Author: Chocolim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-04 18:21:55

Klucz podstawowy powinien być wybrany atrybutem statycznym. Ponieważ adresy e-mail nie są statyczne i mogą być udostępniane przez wielu kandydatów, więc nie jest dobrym pomysłem, aby używać ich jako klucza podstawowego. Ponadto adresy e-mail są ciągami Zwykle o określonej długości, które mogą być większe niż unikalny identyfikator chcielibyśmy użyć[len (email_address)>len (unique_id)], więc wymagałoby to więcej miejsca, a nawet najgorsze, że są przechowywane wiele razy jako klucz obcy. I w konsekwencji doprowadzi to do degradacji wydajność.

 0
Author: user2719152,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-24 06:03:41

Nie używaj adresu e-mail jako klucza podstawowego, zachowaj unikalny adres e-mail, ale nie używaj go jako klucza podstawowego, używaj identyfikatora użytkownika lub nazwy użytkownika jako klucza podstawowego

 0
Author: Nikki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-10 14:18:15