![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 55 Pomógł: 1 Dołączył: 11.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
Mam nietypowe pytanie (IMG:style_emoticons/default/wink.gif)
Otóż mam takie przyzwyczajenie że zawsze do każdej tabeli dodaje pole ID auto increment, ale czy to jest dobra praktyka? np przy systemie logowania i tak nazwa użytkownika czy email musi być unikalny więc na co komu pole ID? Kiedyś ktoś mocno przekonywał mnie że zawsze warto dodać takie unikalne i jednoznaczne pole ID w tabeli, ale czy aby na pewno ? pozdrawiam |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Generalnie, warto. Koszt dodania takiej kolumny jest niemal zerowy, a jest to mimo wszystko najwygodniejszy sposób identyfikacji rekordów.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
A warto dlatego, że lepiej operować na liczbach niż stringach. (IMG:style_emoticons/default/smile.gif) Choćby dlatego, że liczby są ułożone w ściśle określony sposób i wiesz, że po 1 wystąpi 2 (zakładając brak dziur w rekordach), a stringi trzeba najpierw posortować alfabetycznie.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@Fifi209: Tekst to nic innego jak ciąg liczb, a indeksy w obu przypadkach muszą być posortowanie. Na dobrą sprawę indeks kolumny tekstowej też jest numeryczny.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 55 Pomógł: 1 Dołączył: 11.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
Jednym słowem jedyny plusem jest to że przetwarzając rekord po pobraniu z bazy posługujmy się krótkim nr ID a nie dłuższym stringiem...
|
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
@Crozin, @Fifi: w większości przypadków pole primary z autoincrement ma sens, ale nie zawsze. Dla mnie w przypadku choćby tabeli łączącej dla relacji many-2-many nie ma to sensu. Niby po co by miała tam taka kolumna być? (IMG:style_emoticons/default/wink.gif) Tam gdzie faktycznie trzeba identyfikować pojedyncze wiersze, ma to sens. A więc tabele userów, newsów, komentarzy, artykułów czy czego tam się chce mają uzasadnione istnienie takiej kolumny. Tak samo tabele skrajne dla złączenia, ale już dla tabeli łączącej jest to zbędne. Bo niby czemu mielibyśmy identyfikować konkretne złączenie, które w przypadku wspomnianej many-2-many może być zaledwie jednym z większej ilości dopasowań dla elementu po jednej ze stron.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@thek: Sytuacji, gdzie klucze główne są złożone nie brałem pod uwagę. Znalazło by się jeszcze kilka innych przykładów gdzie wrzucanie ID nie ma sensu, ot chociażby tabele z tłumaczeniami (id_zasobu, id_języku) czy nadrzędna relacja 1-1.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 65 Pomógł: 2 Dołączył: 5.12.2006 Ostrzeżenie: (0%) ![]() ![]() |
INDEXY na strinach działają tylko w pewnych sytuacjach w sensie faktycznie przyśpieszają przeszukiwanie. Warto doczytać dokumentacje. Wyszukanie rekordu po id gdzie primary jest z pewnością dużo szybsze. Tak samo z edycją. Dlatego zawsze warto, pomijając tabele o których była mowa.
Pozdrawiam |
|
|
![]()
Post
#9
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
I właśnie dlatego o tych sytuacjach wspomniałem. Niech autor wie, że są takowe sytuacje, gdzie wrzucanie klucza primary z autoincrement nie ma sensu i jedyne co robi to tworzy zbedny indeks. Ba, całą zbędną kolumnę. My raptem podaliśmy pewne warianty najpowszechniejsze, gdzie podejście autora nie ma racji bytu.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 65 Pomógł: 2 Dołączył: 5.12.2006 Ostrzeżenie: (0%) ![]() ![]() |
W sumie zmieniłbym nawet zdanie i powiedział że jest sens zawsze chociażby ze względu na prędkość złączenia za pomocą klucza, jeśli złączenie nie po kluczu to i tak edycja szybsza. Poza tym chciałbym jeszcze dodać że w praktyce rozróżnianie userow po e-mailu bardzo złym pomysłem pomijajac kwestie wspomniane wcześniej. Załóżmy że masz iluś tam użytkowników i masz ich profile. I teraz chcesz mieć link do jego profilu. I co w tedy ? Rozumiem że będziesz wszędzie podawał ich e-maile ; ) Reasumując ja zawsze dodaje to id, nawet jeśli ktoś twierdzi że może do końca to nie ma sensu. Nic Cię to nie kosztuje, a taka pseudo optymalizacja zapewne wywiedzie Cię w pole. Pozdr
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 202 Pomógł: 36 Dołączył: 10.06.2011 Skąd: Dokąd Ostrzeżenie: (0%) ![]() ![]() |
A jaki jest konkretny, z życia wzięty przykład tabeli many-2-many, gdzie stosowanie id jest niepotrzebne?
|
|
|
![]()
Post
#12
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
A widziałeś kiedyś tabelę many-2-many z kluczem autoincrement primary założonym na jedną z kolumn? Ja najwyżej z założonym unique na obie jednocześnie. To, że obie kolumny zawierają pola z jakimś id typu int to chyba logiczne. Sednem problemu jest to jaki indeks założono i na jakie kolumny. Przykład tabeli życiowy? Produkt i kategorie w sklepie (IMG:style_emoticons/default/smile.gif) Jeden produkt może należeć do kilku kategorii, a jednocześnie jedna kategoria może zawierać wiele przedmiotów. Tabela łącząca zawiera id_produktu i id_kategorii, a indeks założony na obie kolumny jednocześnie z atrybutem unique. Implikacje? Chyba nie trzeba przytaczać (IMG:style_emoticons/default/smile.gif)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 04:14 |