Id jako long czy string?

0

Tworze system, który komunikuje się z jakimś tam klientem tworzonym przez inny zespół w innej technologii i od nich dostaje obiekty, które ID mają long? a nie string.

Co o tym myślicie?
Czemu po swojej stronie miałbym trzymać też long? zamiast string?

0

Serio? oO Bo na przykład long to idealny kandydat na autoinkrementujący się klucz sztuczny w bazie danych?

1

@Błękitny Orzeł a jesteś w stanie powiedzieć, dlaczego wolałbyś dostawać te Id jako string?

4

Jedyne zastosowanie ID z typem string jakie przychodzi mi do glowy, to gdy planujemy po cichu sabotazowac dany system. :-)

0

Taki, że ja po swojej stronie nie tworze tego Id więc zastanawiam się czy nie zmieniać tego na string.

3

Ale rozumiesz, że to oni mają dobrze, a Ty jakieś WTF odstawiasz?
Przestań psuć i zacznij też używać sensownych typów do Id, string to najgorszy możliwy wybór.

0

Hmm to ciekawe. Mnie na studiach na bazach uczyli, że wszystko czego dodawanie/mnożenie nie ma sensu powinno być jako string. Czy zgadzacie się z tym? (Oczywiście ID są int'ami niejako przez konwencję, ale chodzi mi o wszystkie inne kolumny w bazie danych)

4

Nie, typ danych dopasowuje się do potrzeb, a nie do pomysłów wykładowcy.

Id powinno być liczbą, bo porównywanie liczb jest znacznie szybsze niż stringów. A Id porównuje się często, we wszystkich operacjach typu wyszukiwanie, złączenia, przeliczanie indeksów przy wstawianie danych, itd. Jeśli danych jest tyle, że long to za mało, to używa się Guida, a nie stringa.

Stringa używa się do danych tekstowych. Szczególnym ich przypadkiem są numery. Numery to nie liczby, nawet jeśli składają się z samych cyfr jak PESEL czy IBAN.

0

@Chory Szewc totalnie idiotyczny pomysł, co więcej może potem powodować wiele problemów, bo indeksy na stringach są nieporównywalnie wolniejsze od indeksów na liczbach.

1
bartk napisał(a):

Jedyne zastosowanie ID z typem string jakie przychodzi mi do glowy, to gdy planujemy po cichu sabotazowac dany system. :-)
--

somekind napisał(a):

Ale rozumiesz, że to oni mają dobrze, a Ty jakieś WTF odstawiasz?
Przestań psuć i zacznij też używać sensownych typów do Id, string to najgorszy możliwy wybór.
--

Shalom napisał(a):

@Chory Szewc totalnie idiotyczny pomysł, co więcej może potem powodować wiele problemów, bo indeksy na stringach są nieporównywalnie wolniejsze od indeksów na liczbach.
--

Niekoniecznie.
https://www.depesz.com/2012/06/07/123-vs-depesz-what-is-faster/
Jeżeli String jest stosunkowo krótki, to różnica pomiędzy PK na String, a PK na na przykład Long nie przekracza 5%.
ID typu string to np. UUID, który stosowany jest przy klastrowaniu, oznaczaniu partycji w Linuxie a PostgreSQL posiada już nawet taki typ jak UUID https://www.postgresql.org/docs/9.1/static/datatype-uuid.html

0

String do 8 znaków przy 64 bitowej platformie można jako inta/long(ważne żeby 8 bajtów było, co w niektórych inty mają 4) traktować, co daje to samo jak porównywanie intów.
Ale musi też być maksymalnie 9 znakowy string z zerem.

0

Nawet jakby do tego zastosować wyszukiwanie metodą dziel i rządź, to wyszło by tyle samo operacji co na intach, ale mniej kombinacji ze względu na nie printowalne znaki.
I jakby ktoś wstrzyknął liczbę z poza zakresu, to po prostu wybrany by był string, nieskorelowany z nim z powodu aproksymacji.
Ale naprawa tego wymagała by jedynie upewnienia się, że znaleziony string jest, tym jakiego szukano czyli + jeden if do operacji np. 32 stringi 5 sprawdzeń głębokości + 1 weryfikacyjny.

3

No ale dokladnie jak @karolinaa pisze. Czasem UUID jest całkiem rozsądnym rozwiązaniem i wtedy można go wrzucić jak varchar(16); (plus jeszcze prawie każda baza ma tricki / własne typy na uuidy , guidy)

0

ID masz na poziomie interfejsu określone jako long. Jak to sobie będziesz w swoim systemie przechowywał to Twoja sprawa.
Na poziomie interfejsu musisz produkować poprawne wartości, sprawdzać czy otrzymujesz poprawne i tyle.

1

Tak jak niektórzy przedmówcy powiedzieli identyfikator powinien być liczbą z powodów optymalizacji porównań, wyszukiwań, indexów, etc.!
Jedyne argumenty przemawiające za użyciem stringa (jedynie w postaci UUID/GUID) to:
-> środowisko rozproszone
-> duża liczba rekordów (większa od zakresu int/long)
-> unikalność identyfikatorów niezależnie od typu

2

Ale GUID to jest przecież liczba, a nie żaden string. :|T
A to, że wyświetlamy go sobie jako string jest tylko dla ludzkiej wygodny. Przecież inty i longi też widzimy jako string.

0

Wszystko właściwie zostało już powiedziane. GUID to LICZBA, a nie string. Identyfikatory nie powinny być stringiem. Mogą nim być technicznie, ale nie powinni. Czy możesz dać w mordę wykładowcy? Technicznie możesz. Ale raczej nie powinieneś.

Stringów używa się tylko i wyłącznie tam, gdzie potrzebujemy stringa. Czyli teksty i długie numery (PESEL, IBAN - jak mówił somekind).

1 użytkowników online, w tym zalogowanych: 0, gości: 1