Datubāzes bez miglas

„Kotomarket” shēma

11 min
What you'll learn
  • atrast vajadzīgo tabulu starp piecām „Kotomarket”: users, products, orders, order_items, events
  • lasīt ER diagrammu: noteikt saites kardinalitāti (1:N, N:M, 1:1) pēc tā, kur atrodas ārējā atslēga
  • izvērst saiti „daudzi pret daudziem” caur starptabulu ar diviem FK — kā order_items ar order_id + product_id
  • izskaidrot, kāpēc pasūtījuma sastāvu nevar glabāt kā id virkni tieši orders

Šodien QUERY izvieto uz galvenā galda visu aprakstu uzreiz. Piecas mirdzošas plaknes uzkaras gaisā un lēni griežas — saglabājušās pasaules karte. Blakus mirgo konservācijas žurnāls, pievienots momentuzņēmumam, un viena rinda tajā ir pasvītrota: „Nododu piecas tabulas un sestās pēdas. — K.” Tu pārskaiti plaknes. Tieši piecas. Kur pēdas?

QUERY: Nenovēršies uz pēdām. Vispirms iemācies šīs piecas tā, lai atrastu ceļu aizvērtām acīm, — pārējo arhīvs parādīs pats, kad uzskatīs tevi par gatavu.

Piecas „Kotomarket” tabulas

Tālāk mēs strādāsim ar šo datubāzi — interneta veikala momentuzņēmumu par 2024. gadu. Turi to kā veikala karti: kurš ienāca, kas atrodas uz vitrīnas, ko nopirka un kādas darbības veica pirms pirkuma.

TabulaKo glabā
userspircējus: id, vārdu, pilsētu un reģistrācijas datumu
productsvitrīnas preces: id, nosaukumu, kategoriju, cenu un atlikumu
orderspasūtījumus: id, user_id, datumu, statusu un summu
order_itemspasūtījumu sastāvu: kura prece, cik gabalu un par kādu cenu
eventsuzvedības notikumus: skatījumus, pievienošanu grozam un pirkumus

Saites lasāmas tā: viens user → daudz orders; viens order → daudz order_items; viens product → daudz order_items. Ja apmaldīsies, atver shēmu pa labi — tā ir kā tirdzniecības zāles plāns.

Ieskatīsimies pasūtījumu tabulā: katrā rindā ir user_id — atsauce uz pircēju. Tā viena tabula saistās ar citu, un karte beidz būt piecas atsevišķas salas.

Piecas hologrāfiskas tabulas-plaknes griežas kā zvaigznājs, savienotas ar pavedieniem; nostāk tikko manāma sestā kontūra punktētā pēda
Arhīva karte: piecas tabulas un saites starp tām. Konservācijas žurnāls sola arī „sestās pēdas” — taču pagaidām tā nav redzama.

Kotomarket’s five tables

From here on we’ll be working with this database — a of an online shop from 2024. Hold it like a map of the store: who walked in, what’s on the shelves, what they bought, and what they did before buying.

TableWhat it holds
usersbuyers: id, name, city, and signup date
productsstorefront items: id, name, category, price, and stock
ordersorders: id, user_id, date, status, and total
order_itemsorder contents: which product, how many, and at what price
eventsbehavioral events: views, add-to-carts, and purchases

The links read like this: one user → many orders; one order → many order_items; one product → many order_items. If you get lost, open the schema on the right — it’s like the floor plan of the shop.

Let’s peek into the orders table: every row has a user_id — a reference to a buyer. That’s how one table links to another, and the map stops being five separate islands.

Pasūtījumi un to saite ar pircēju caur user_id:
Query result
iduser_idstatustotal_amount
118paid5980.00
210paid19750.00
326cancelled9560.00
426paid15530.00
58paid26710.00
637paid42110.00

Kā lasīt ER diagrammu

Karti, ko izvērsa QUERY, nozarē sauc par ER diagrammu (entity–relationship): taisnstūri ir tabulas, līnijas starp tām ir saites pa ārējām atslēgām. Vissvarīgākais uz līnijas ir kardinalitāte: cik rindu no vienas puses atbilst cik rindām no otras.

  • 1:N, viens pret daudziem — visbiežākā saite. Viens pircējs — daudz pasūtījumu. Ārējā atslēga vienmēr atrodas „daudzu” pusē: user_id glabājas orders, nevis otrādi. Tas arī ir lasīšanas likums: atradi FK — atradi N pusi.
  • N:M, daudzi pret daudziem — vienā pasūtījumā daudz preču, un viena prece sastopama daudzos pasūtījumos. Tādu saiti relāciju datubāzē tieši izteikt nevar: ārējo atslēgu nav kur nolikt. To izvērš caur starptabulu — mums tā ir order_items. Katra tās rinda nes atsauču pāri order_id + product_id un pārvērš vienu N:M saiti par divām 1:N saitēm. Bonuss: pašai saitei parādās atribūti — gabalu skaits un cena pirkuma brīdī.
  • 1:1, viens pret vienu — sastopama retāk: piemēram, smagus vai privātus laukus izceļ atsevišķā tabulā ar to pašu atslēgu.
-- N:M atraisīšana darbībā: pāri „pasūtījums — prece” no order_items
SELECT order_id, product_id, quantity
FROM order_items
LIMIT 6;
usersidnameproductsidpriceordersiduser_ideventsuser_idproduct_idorder_itemsorder_idproduct_iduser_id → idproduct_id → idPKFK (reference)
„Kotomarket” ER diagramma: 1:N saites no users uz orders un N:M atraisīšana starp orders un products caur order_items.

Grābekļi: glabāt pasūtījuma sastāvu tieši orders — kā virkni '7,12,3' vai identifikatoru masīvu. Tādus datus nevar aizsargāt ar ārējo atslēgu, godīgi saskaitīt vai savienot ar vitrīnu bez akrobātikas. Redzi saiti „daudzi pret daudziem” — veido starptabulu ar divām ārējām atslēgām, kā order_items.

Interview question

Jautājums no darba intervijas: kā relāciju datubāzē realizēt saiti „daudzi pret daudziem”?

Spēcīga atbilde: caur starptabulu ar divām ārējām atslēgām uz savienojamajām tabulām — kā order_items ar order_id un product_id: tā pārvērš N:M par divām 1:N saitēm. Tajā pašā laikā tajā glabā pašas saites atribūtus — daudzumu, cenu pirkuma brīdī. Tādas tabulas primārā atslēga ir vai nu salikta no diviem FK, vai surogāta id.

Check yourself
Kur shēmā redzams, kura prece nokļuvusi kurā pasūtījumā?