UUID zamiast ID generowanego przez bazę

UUID zamiast ID generowanego przez bazę
SA
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:94
0

Czy jeśli używa się UUID, to ID w postaci longa/inteagera generowanego przez bazę danych jest już niepotrzebne?

SL
  • Rejestracja:około 7 lat
  • Ostatnio:około 12 godzin
  • Postów:857
4

Jeśli chodzi o czystość: nie ma sensu, lepiej mieć jeden id niż dwa oznaczające to samo.
Jeśli chodzi o wydajność to może mieć to sens, gdy nie używasz kolumny uuid jako klucz czy jako indeks. Przez swoją losowość UUID słabo współgra z b-tree, są nawet rozszerzenia, które to minimalizują https://github.com/tvondra/sequential-uuids jak i nowe formaty UUID https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-01.html

R7
Ale to jest jakaś specyfika PostgreSQL, z tego co czytam w opisie tego rozszerzenia. Sekwencyjnie generowane ID tworzy drzewo przeważone w lewo, co nie zawsze jest zaletą. Dużo zależy od sposobu korzystania z tego indeksu. Jeśli kolejne odczyty dotyczą sąsiednich wartości kluczy, wtedy lepsze są ID narastające. Tak samo gdy chcemy odczytywać ostatnio utworzone dane, czyli bierzemy je z prawej strony drzewa. Ale przy dużej liczbie odczytów po losowych ID przez wiele procesów równocześnie, właśnie rozproszenie kluczy po indeksie pozwoli uniknąć problemu "hot blocków".
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
2
Sampeteq napisał(a):

Czy jeśli używa się UUID, to ID w postaci longa/inteagera generowanego przez bazę danych jest już niepotrzebne?

A z jakich motywacji myslisz o tym UUID ?

Argumenty ZA Uuid / Guid widzę ze 2-3, wiele więcej za Id
a) UUid jest generowany przez libkę do perzystencji (Hibernate), i jest określony jeszcze przed zapisem. Wprawdze jak po ludzku się buduje powiazania obiektów Hibertane, nie jest to potrzebne, ale z rzadka się przyda (hardkorzy kodujacy obiekt obcy jako int zamiast referencji, taka "optymalziacja" która zabija sens używania hibernate)
b) jest taki schemat włamu / nadużycia apki webowej, która ujawnia id, np http:alamakota/invoices?id=17 przez wbicie nastepnej liczby uzyskuje wgląd w fakturę, w która by wglądu nie miał - jeśli tam w URL jest Uuuid, włam jest niemal niemożliwy
c) bardzo wyrafinowane i niszowe zagadnienia serializacji / transferu rekordów do innej bazy

Wiecej argumentów za uuid nie przypominam sobie
tabela z id, mozna na to liczyć, gdy się nie poda order by przy odczycie, jest zwykle w miare "estetycznie" posortowana
wydajność itd... wiele przemawia za id

slsy napisał(a):

Jeśli chodzi o czystość: nie ma sensu, lepiej mieć jeden id niż dwa oznaczające to samo.

Ma sens miec dwa w przypadku b)


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
jarekr000000
Podstawowy argument za UUID to skalowalność/replikacje multi master.
SL
UUID może podać (ale nie musi) klient nie związany z aplikacją. Zawsze to jakiś ficzer
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:12 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0
slsy napisał(a):

Przez swoją losowość UUID słabo współgra z b-tree

A jeśli ma się UUIDa rosnącego w czasie? Pamiętam że w Cassandze był taki algorytm generowania UUIDa że górna część to był czas a dolna część to był IPik komputera (czy jakoś tak). Dzięki temu UUID był zawsze rosnący

UPDATE chyba UUID - Version 1


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 2x, ostatnio: KamilAdam
ZD
@KamilAdam: Pytanie czy to nadal uuid, czy Olx uuid, ten jest na wyższym stopniu rozwoju bo ma kolejność ;)
RequiredNickname
  • Rejestracja:prawie 5 lat
  • Ostatnio:mniej niż minuta
  • Postów:613
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 godzin
  • Postów:3277
1

@robertos7778: Ten indeks musi być zmaterializowany do jakiejś fizycznej formy na dysku. Dopisanie czegoś na końcu indeksu jest tańsze niż dopisanie czegoś w środku. Jeszcze większy problem będziesz mieć jeżeli założysz indeks klastrowy na kluczu głównym, bo będzie konieczna nie tylko przebudowa indeksu, ale i danych.

MY
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:24
0

Nie lubię ID generowanego przez bazę, ponieważ oznacza to, że moja encja w początkowym etapie jest jakby niekompletna - brakuje jej ID. W Javie to jeszcze przejdzie, bo wszystko może być nullem (chociaż muszę się pilnować, żeby użyć instancji zwróconej z repozytorium) i nawet nie zauważę, ale np. w Kotlinie oznacza to, że wszędzie muszę się uganiać z typem nullowalnym. Repozytorium nie musi też zwracać zapisanej encji, mam "kontrolę" nad generowaniem ID w testach (przydało się, chociaż pewnie dało się lepiej to zrobić).

edytowany 1x, ostatnio: mythflame
R7
  • Rejestracja:około 6 lat
  • Ostatnio:7 miesięcy
  • Postów:216
0

@piotrpo:
To już są szczegóły implementacyjne, która każda baza może realizować inaczej. Przecież dopisanie "w środku" nie oznacza, że trzeba rozpychać indeks i przepisywać jego fragmenty. Można dodać kolejny "blok" indeksu z N liśćmi, a jego adres dopisać do węzła drzewa powyżej, który i tak musi znać lokalizację swoich węzłów (liści)-dzieci. Minus indeksu zapisywanego w sposób losowy to operacja range-scan na takim indeksie, no ale nie po to się go tworzy w taki sposób, żeby sąsiednie klucze leżały obok siebie.
Jeśli często sięgamy do sąsiednich kluczy lub skanujemy ich zakresy to lepsze są klucze generowane po kolei.
Ale jeśli mamy dużo odczytów po kluczu unikalnym lub prawie-unikalnym i mamy równocześnie wiele sesji to robiących, to klucze losowo trafiające w strukturę drzewa pozwolą na rozłożenie obciążenia pod kątem I/O. Oczywiście zakładając, że warstwa fizyczna posiada wiele urządzeń, które równocześnie mogą być odczytywane. Jak pod spodem będzie jeden dysk, to będzie gorzej.

edytowany 1x, ostatnio: robertos7778
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)