„Kotomarket” shēma
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_itemsarorder_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.
| Tabula | Ko glabā |
|---|---|
users | pircējus: id, vārdu, pilsētu un reģistrācijas datumu |
products | vitrīnas preces: id, nosaukumu, kategoriju, cenu un atlikumu |
orders | pasūtījumus: id, user_id, datumu, statusu un summu |
order_items | pasūtījumu sastāvu: kura prece, cik gabalu un par kādu cenu |
events | uzvedī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.

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.
| Table | What it holds |
|---|---|
users | buyers: id, name, city, and signup date |
products | storefront items: id, name, category, price, and stock |
orders | orders: id, user_id, date, status, and total |
order_items | order contents: which product, how many, and at what price |
events | behavioral 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.
user_id:| id | user_id | status | total_amount |
|---|---|---|---|
| 1 | 18 | paid | 5980.00 |
| 2 | 10 | paid | 19750.00 |
| 3 | 26 | cancelled | 9560.00 |
| 4 | 26 | paid | 15530.00 |
| 5 | 8 | paid | 26710.00 |
| 6 | 37 | paid | 42110.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_idglabājasorders, 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āriorder_id+product_idun 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;
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.