Autor Wątek: [mySQL] Identyfikacja wpisów  (Przeczytany 2902 razy)

Offline LizarD

  • Użytkownik

# Listopad 27, 2016, 19:12:10
Witam!

Każdy wpis w bazie danych powinien mieć pewną unikalną wartość dzięki której da się go zidentyfikować, najlepiej gdyby tą wartością był któryś rekord ale co jeżeli dane się powtarzają ?  Jak zidentyfikować wpis ? W Bazie Danych  będę przechowywał Imiona Nazwiska adresy E-mail numery telefonów, więc na pierwszy rzut okna unikalną wartością jest numer telefonu, lecz co jeżeli zamiast numeru telefonu w bazie podany zostanie adres e-mail a pole z numerem telefonu zostanie puste ? Jedna z tych wartości musi zostać podana aby dodać wpis do bazy, tylko czy nie przeczy to jakiejś konwencji czy wzorcowi identyfikowanie wpisu raz po jednej wartości a raz po drugiej ? Czy może identyfikować wpisy poprzez hash numeru telefonu i adresu e-mail ?

Tutaj jest przedstawione jakie mogą być wpisy w bazie danych, wiec jak mogę zidentyfikować wpisy ?

-- Imie ----  Nazwisko -- e-mail ---- nr ---
Jan       |     Kowalski  |                 |   5487
Jan2    |     Kowalski2 | xx@x.pl| 

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Karol

  • Użytkownik

  • +1
# Listopad 27, 2016, 19:18:47
1. Wrzuć tam kolumnę id auto_increment jak każdy normalny dev :)
2. Zrób klucz z wszystkich 4 kolumn.

Offline TDM

  • Użytkownik

# Listopad 27, 2016, 19:28:27
Czyli albo jedno rozwiązanie albo drugiej, tylko tak dołączając się do pytania to pojawia się kolejne pytanie, użytkownik ma możliwość dodawania, usuwanie i edytowania wpisów, wiec w przeglądarce zaznaczam jeden z wpisów które wyświetlane są w tabeli, edytuje je i jak w bazie zedytować konkretny wpis, nie chcę w tabeli wyświetlać klucza identyfikującego, chyba że przy pomocy np jQuery ukryć kolumnę tabeli

Offline Karol

  • Użytkownik

# Listopad 27, 2016, 20:16:24
id można przekazać w polu typu hidden, albo w urlu forma. Trzeba tylko zadbać o weryfikację czy user ma prawo do edycji danego rekordu.

Offline lethern

  • Użytkownik

# Listopad 27, 2016, 21:11:17
OP w sumie nic o Webówce nie wspomniał, ale jak już o tym mowa, to jeszcze pare rzeczy na logikę: cały mechanizm update może iść jako ajax; z JSem mozna to zrobic bez hidden (nawet przy pomocy attribute), jeśli pominąć JS to w ASP.NET są mechanizmy które pomagają z czymś takim (jeśli używamy np. Grid, DataKeyNames), podejrzewam że inne języki i ich web-frameworki też coś mają

odnośnie głównego wątku: primary key?
Cytuj
(...)unikalną wartość dzięki której da się go zidentyfikować, najlepiej gdyby tą wartością był któryś rekord
powiedziałbym raczej "nie najlepiej", dane biznesowe nie pomogą w tych technikaliach, właśnie ze względu na to że możesz je edytować
(wyobraź sobie, że przechowujesz "123ads" jako klucz do swojego rekordu, czy to hash czy nazwisko czy cokolwiek, następnie ten rekord edytujesz, przez co... klucz który właśnie przechowujesz przestaje działać, więc musisz go zaktualizować - pół biedy jeśli tylko w tym kontekście, ale co jeśli identyfikujesz rekord w innym miejscu, jak np. w innych tabelach (foreign key), w innym kontekście w aplikacji, lub w czymkolwiek? po edycji tamte klucze są zepsute i raczej nad tym nie zapanujesz)

dlaczego nie tak??
Id- Imie ----  Nazwisko ---- e-mail -- nr
1 | Jan     |     Kowalski  |        |   5487
2 | Jan2    |     Kowalski2 | xx@x.pl| 


PS nawet z PrimaryKey jako integer potrafi być problem, np. jeśli masz więcej niż jedną mazę i chcesz dokonać ich merge w jedną wspólną bazę, w takim przypadku zawczasu primaryKey powinien mieć typ nie int/bigint a guid/uuid (np. a822ff2bff02461db45ddcd10a2de0c2), ale to taka (nieoptymalna) ostateczność
« Ostatnia zmiana: Listopad 27, 2016, 21:22:35 wysłana przez lethern »

Offline TDM

  • Użytkownik

# Listopad 30, 2016, 11:48:03
Czyli że identyfikator id auto_increment to numer kolejnego wpisu i tak będzie najlepiej ? Tylko co jeżeli powstaną dziury przy usuwaniu np środkowego wpisu ?
id - Imie ...
1 |  ....
2 |  ....
3 |  ....
4 |  ....
5 |  ....
[/code]

I usuwam wpis numer 3 i mam, więc powinienem mieć jakąś dodatkową funkcje sprawdzającą przy dodawaniu nowego wpisu czy np. nowemu rekordowi mogę przydzielić id nr 3 ?


Cytuj
OP w sumie nic o Webówce nie wspomniał, ale jak już o tym mowa, to jeszcze pare rzeczy na logikę: cały mechanizm update może iść jako ajax; z JSem mozna to zrobic bez hidden (nawet przy pomocy attribute), jeśli pominąć JS to w ASP.NET są mechanizmy które pomagają z czymś takim (jeśli używamy np. Grid, DataKeyNames), podejrzewam że inne języki i ich web-frameworki też coś mają

Więc jak to zrobić za pomocą JS, jQuery?

Offline Karol

  • Użytkownik

# Listopad 30, 2016, 15:42:14
I usuwam wpis numer 3 i mam, więc powinienem mieć jakąś dodatkową funkcje sprawdzającą przy dodawaniu nowego wpisu czy np. nowemu rekordowi mogę przydzielić id nr 3 ?
Nie musisz się tym przejmować, baza wie jaki następny numer nadać nowemu wierszowi, a tych usuniętych się nie używa ponownie.

Więc jak to zrobić za pomocą JS, jQuery?

Przekazujesz id w url query albo w formularzu, innego wyjścia nie ma. Możesz wysyłać POSTa pod np. save.costam?id=X albo PUT obiekt/X (tak proRESTowo) albo POST save.costam + <input type="hidden" value="X" name="id">. Jeżeli wysyłasz formularz JSem to możesz dodać id z poziomu skryptu do adresu lub danych i nie musi siedzieć wtedy w hidden, metod jest wiele, ale tak czy siak po stronie serwera masz tylko dwie opcje: pobrać id z GETa lub z POSTa (no, można jeszcze trzymać w danych sesji, ale wtedy się posypie wszystko jak ktoś będzie działał na 2+ zakładkach).

Offline kubera

  • Użytkownik
    • Prywatna strona

# Grudzień 01, 2016, 22:11:09
Ja tu widzę 3 tabele:

TYPY KONTAKTY
RODZAJ_KONTAKTU
Przykłady: "email""telefon komórkowy"
"telefon stacjonarny"
"telefon satelitarny

OSOBY
ID, IMIE,NAZWISKO

KONTAKTY klucz obcy do TYPU_KONTAKTY i klucz obcy do OSOBY
OSOBY_ID
RODZAJ_KONTAKTU
TREŚĆ_KONTAKTU (numer telefonu i inne).

Nie mówię, że dosłownie tak, gdyż mozną w kazdej tabeli dać jej ID i samodzielnie zdecydować jaki jest klucz główny.
« Ostatnia zmiana: Grudzień 01, 2016, 22:15:08 wysłana przez kubera »

Offline Rakieta

  • Użytkownik

  • +1
# Grudzień 01, 2016, 23:11:29
Nie wiem czy autora to jeszcze interesuje.

Przede wszystkim nie musisz zabezpieczać ID.

Natomiast jakiej tabeli byś nie tworzył w SQL, pierwsza kolumna, którą powinieneś dodać, to zawsze ID z Auto Increment. Jeśli tworzysz 4 tabele, 4 tabele powinny mieć ID. Po czymś musisz identyfikować wiersze, czymś musisz je sortować, ustalać kolejność ich powstania, tworzyć odniesienia względem siebie. Do tego właśnie służy jedna magiczna kolumna ID :)

Offline LizarD

  • Użytkownik

# Grudzień 02, 2016, 19:41:50
Wszystko mnie interesuje nawet po rozwiązaniu problemu. Czyli mam rozumieć że usuniętych kluczy się nie używa i tym zajmuje się już baza danych i ja w to nie ingeruje czyli mam się tym nie przejmować ? Pytanie dlaczego tak jest ?

@Up klucz obcy do tabeli kontaktu etc. to identycznie go generować ? Czemu nie zrobić osobnej tabeli dla Imion, Nazwisk ? W przypadku gdy Imie się będzie powtarzać to mamy oszczędność danych ?
« Ostatnia zmiana: Grudzień 02, 2016, 19:44:58 wysłana przez LizarD »

Offline lethern

  • Użytkownik

# Grudzień 02, 2016, 20:20:20
A jak ktoś ma 2 imiona, to zrobisz tabelę łączącą do tabeli imiona? I będziesz miał
Osoba <-> osoba_imię_cross <-> imię
albo po prostu sobie te kilka kilobajtów oszczędności darować

Offline kubera

  • Użytkownik
    • Prywatna strona

# Grudzień 03, 2016, 00:19:03
A jak ktoś ma 2 imiona, to zrobisz tabelę łączącą do tabeli imiona? I będziesz miał
Osoba <-> osoba_imię_cross <-> imię
albo po prostu sobie te kilka kilobajtów oszczędności darować

Wg mnie zdecydowanie darować sobie. Jeśli imiona i nazwisko będą w jednej tabeli, to jest szansa, że BD szybciej odczyta skojarzone dane. Rzecz w tym, że po imiona trzeba byłoby sięgać do innej tabeli, a więc może i do innej lokalizacji na dysku,

Offline LizarD

  • Użytkownik

# Grudzień 03, 2016, 15:50:03
Wiec nie lepiej już zrobić jedną tabele ? Skoro numer / email i tak mi się nie powtórzy ?

Offline kubera

  • Użytkownik
    • Prywatna strona

# Grudzień 03, 2016, 16:39:56
Może :)

Offline LizarD

  • Użytkownik

# Grudzień 04, 2016, 13:41:41
Więc skoro mogę mieć zapisane wszystkie typy kontaktu w rekordzie to jest sens tak komplikować ?