PRIMARY KEY oraz numer zamówienia

0

Witam,
tworzę sklep i zastanawiam się jak lepiej jest tworzyć główny klucz. Od razu wyjaśnię że mam coś takiego jak numer zamówienia i jest to np: xyz123jdiw3412x

Oczywiście mam tabelę order i product.

Teraz mam 2 opcje tworzenia tabeli order:

  1. PRIMARY KEY order_id - int(11) AUTO INCREMENT oraz order_nr - char(15)
  2. PRIMARY KEY order_nr - char(15)

Opcja 1 jest na pewno mniej zawodna bo nie ma możliwości powtórzenia klucza głównego.

Natomiast opcja 2 jest szybsza w działaniu, ponieważ nie musimy pobierać najpierw zamówienia po order_nr a potem wyszukiwać produktów dla order_id.

Proszę o porady.

0

Przestrzeń dyskowa zaalokowana na potrzeby bazy danych jest podzielona na bloki danych, często nazywane stronami. Strona jest podstawową jednostką na której operuje baza danych, co oznacza, że baza danych aby odczytać jeden rekord odczytuje całą stronę, nawet jeżeli na stronie mieście się wiele rekordów.

W bazie danych indeksy tworzone są zazwyczaj w formie binarnych drzew zbalansowanych. Gwarantuje to logarytmiczny czas wykonania wszystkich operacji w bazie. Struktura taka jest szerzej znana jako B-tree. B-tree składa się korzenia, gałęzi oraz liści, które zawierają uporządkowane pozycje.

Na stronie mieści się określona ilość indeksów w zależności od typu i rozmiaru danych użytego do przechowywania indeksu. Z tego też powodu zaleca się używanie 4-bajtowego typu INT jako PRIMARY KEY zamiast pól typu CHAR zajmujących więcej niż 4 bajty.

Taka jest ogólna zasada mająca zastosowanie w 99% przypadków, tylko w niektórych specyficznych sytuacjach lepsze będzie użycie pola CHAR jako PRIMARY KEY.

Co do Twojego problemu to ciężko coś powiedzieć, ponieważ opisałeś strukturę tabel oraz wykonywane na nich zapytania bardzo lakonicznie. Napisałeś, że będziesz miał tabelę order oraz product, a gdzie będziesz przechowywał linijki zamówienia, jakie pola będą w tabeli product, order oraz innych, które będą używane w zapytaniach do tabeli order?

0

Witam,
tab Product - przechowuje produkty gdzie pole product_id to PRIMARY KEY int(11) auto inc., oraz pole order_id które powiązane jest z tabelą Order (inne pola to informacje o samym produkcje)
tab Order - tutaj jest tylko informacja o zamówieniu, do kogo należy oraz o dacie utworzenia.

Mi chodzi o to że lepiej jest ustawić PRIMARY KEY na pole int(11), ale w wielu sklepach numer zamówienia podawany jest w formie "AD432F23FQ42" (tego typu).

I teraz pytanie: co ustawić jako pole Primary key "AD432F23FQ42" czy int(11) ?

Z poziomu php otrzymuję "AD432F23FQ42". Dalszą część wypowiedzi masz w 1 poście.

0

W tym konkretnym przypadku użycie identyfikatora biznesowego czyli numeru zamówienia jako PK w tabeli "order" będzie szybsze niż użycie INT dla zapytania zwracającego listę produktów dla wybranego numeru lub wielu numerów zamówień z tabeli product.

Jeżeli jednak będziesz chciał np. odczytać wszystkie zamówienia z danego miesiąca, roku albo od konkretnego kontrahenta albo odczytać sumę zamówień z danego okresu/od wybranego kontrahent itp. to szybszy będzie PK oparty na polu typu INT.

0

Dziękuję bardzo. Właśnie tak wykonałem tabele (czyli z kluczem typu char), ale nadal zastanawiam się co wybrać prostotę czy szybkość działania

0
xyz2 napisał(a)

ale nadal zastanawiam się co wybrać prostotę czy szybkość działania

A ile tych zamówień będzie - powiedzmy na dzień?
Chodzi o rząd wielkości:

  • 10 dziennie
  • 100 dziennie
  • 1000 dziennie
    .....
  • 100 000 000 dziennie ?
0

Już rozwiązałem wątpliwości, zrobię numerację po int(11), a przy zapytaniu będę używał INNER JOIN

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