| | 11 | |
| | 12 | |
| | 13 | == Статички табели == |
| | 14 | |
| | 15 | === Species, Breed === |
| | 16 | За разлика од останатите статички табели, овие '''не''' се внесени преку `INSERT INTO ... VALUES`, туку се вчитани од надворешни CSV-датотеки (`species.csv`, `breed.csv`). Мора да се вчитат пред `Pet` генерирањето, бидејќи `Pet` и `Breed` зависат од нив преку FK. |
| | 17 | |
| | 18 | === Supplier, Category, Room_Type, Service === |
| | 19 | Внесени директно преку `INSERT INTO ... VALUES` - по 5 добавувачи, 5 категории, 5 типови соби, 8 сервиси. |
| | 20 | |
| | 21 | === Enum lookup табели === |
| | 22 | Единаесет табели (`OrderStatus`, `ReservationStatus`, `ServiceReservationStatus`, `PaymentMethod`, `PaymentStatus`, `DeliveryStatus`, `DeliveryTimeSlot`, `PetDeliveryStatus`, `PetDeliveryDestination`, `MedicalRecordStatus`, `DateStatus`) - внесени преку `INSERT INTO ... VALUES`. |
| | 23 | |
| | 24 | === Hotel === |
| | 25 | 10 хотели, внесени статички. |
| | 26 | |
| | 27 | ---- |
| | 28 | |
| | 29 | == Генерирани табели == |
| | 30 | |
| | 31 | === Employee === |
| | 32 | 300 записи (~30 по хотел). Имиња по случаен избор од привремени табели `first_names_male`/`first_names_female`/`last_names`. Улога, телефон и e-mail генерирани преку `random()`; датум на вработување во опсег до ~2000 дена наназад. |
| | 33 | |
| | 34 | === Room === |
| | 35 | 2,500 записи (250 по хотел). Број на соба составен од хотелски id + буква (A/B/C) + бројка; тип на соба циклично распределен преку `Room_Type`. |
| | 36 | |
| | 37 | === Customer === |
| | 38 | 150,000 записи. Истата шема на генерирање имиња како кај Employee; адреса избрана од привремена табела `addresses`; датум на регистрација до ~1500 дена наназад. |
| | 39 | |
| | 40 | === Product === |
| | 41 | 500 записи. Име составено од фиксна листа производи + реден број; категорија мапирана според фиксен пар име->категорија; добавувач избран случајно преку `ORDER BY md5(...)`. |
| | 42 | |
| | 43 | === Pet === |
| | 44 | 200,000 записи. Име избрано од фиксна листа од 30 имиња (циклично); вид и раса избрани случајно и меѓусебно усогласени (расата секогаш припаѓа на избраниот вид); сопственик поврзан случајно со постоечки клиент. |
| | 45 | |
| | 46 | === "Order" === |
| | 47 | 45,000 записи. Датум, статус (id 1–4) и сума по случаен избор; клиент и хотел поврзани случајно. |
| | 48 | |
| | 49 | === OrderProduct === |
| | 50 | ~23,000 записи (лимитирано на 23,000 нарачки). Количина и единечна цена по случаен избор. |
| | 51 | |
| | 52 | ---- |
| | 53 | |
| | 54 | == Batch-генерирани табели == |
| | 55 | |
| | 56 | === Reservation === |
| | 57 | 10,000,000 записи, 100 итерации × 100,000. Статусите се распределени преку фиксна тежинска табела (6/15 confirmed, 4/15 completed, 2/15 pending, 2/15 cancelled, 1/15 no-show). `reservation_date` е поставен на датумот на регистрација на клиентот + случаен офсет (7–507 дена), со цел да остане конзистентен со `RoomReservation.check_in_date`. Забелешки исто така се доделуваат преку фиксна листа со псевдослучаен избор. |
| | 58 | |
| | 59 | === RoomReservation === |
| | 60 | 10,000,000 записи, 100 итерации × 100,000. Секоја резервација добива точно една соба (`UNIQUE(reservation_id)`); должина на престој 1–6 ноќи. |
| | 61 | |
| | 62 | '''Проверка по вчитување:''' |
| | 63 | {{{#!sql |
| | 64 | SELECT COUNT(*) FROM RoomReservation; -- ~10,000,000 |
| | 65 | SELECT MIN(check_in_date), MAX(check_out_date) FROM RoomReservation; -- 2015–2028 |
| | 66 | }}} |
| | 67 | |
| | 68 | === Date === |
| | 69 | ~11,870,000 записи, генерирани по опсег на `room_id` (batch од 100 соби). Два чекора по опсег: |
| | 70 | 1. '''Occupied''' ноќи - извлечени директно од `RoomReservation` преку `generate_series` на секој опсег check_in–check_out. |
| | 71 | 2. '''Available/Maintenance''' - пополнува ги преостанатите датуми (2015-01-01 до 2027-12-31) за секоја соба, со тежина 3:1 available:maintenance (`ON CONFLICT DO NOTHING`, за да не ги пребрише веќе внесените occupied редови). |
| | 72 | |
| | 73 | === ServiceReservation === |
| | 74 | ~9,000,000 записи. 60% од резервациите со собa добиваат 0 сервиси, 35% 1 сервис, 18% 2 сервиси, 7% 3 сервиси (кумулативна распределба преку `random()`). `scheduled_date` паѓа во опсегот на самиот престој; `scheduled_time` избран од 9 фиксни термини (09:00–17:00). Сервисот по резервација е избран преку детерминистичка хеш-функција од `reservation_id`. |
| | 75 | |
| | 76 | === Payment === |
| | 77 | ~6,000,000 записи, 100 итерации × 100,000. Генерирани '''само''' за резервации со `status_id IN (1, 2)` (confirmed/completed) - оттука бројот на плаќања е помал од вкупниот број резервации. Начин на плаќање и статус на плаќање избрани случајно (статусот со тежина: 4/6 completed, 1/6 refunded, 1/6 pending). |
| | 78 | |
| | 79 | ---- |
| | 80 | |
| | 81 | == Помошни/зависни табели == |
| | 82 | |
| | 83 | === Employee_Service, Product_Service === |
| | 84 | Врски многу-кон-многу, генерирани преку `generate_series` + случаен избор со `DISTINCT` (дупликатите се отфрлаат преку `ON CONFLICT DO NOTHING`), па конечниот број редови може да е нешто помал од целната бројка во `generate_series`. |
| | 85 | |
| | 86 | === Review === |
| | 87 | 150,000 записи. Оценката (1–10) е избрана случајно; коментарот се избира од една од 5 категории текст (во зависност од опсегот на оценката: 9–10, 7–8, 5–6, 3–4, 1–2), секоја со по 10 варијанти. |
| | 88 | |
| | 89 | === MedicalRecord === |
| | 90 | 300,000 записи. Име на ветеринар составено од "Dr." + случајно презиме; статус, алергии, лекови, белешки и дијагноза избрани од фиксни листи (со можност за `NULL` кај алергии/лекови/белешки). |
| | 91 | |
| | 92 | === PetDelivery === |
| | 93 | 80,000 записи (лимитирано на првите 80,000 резервации по случаен редослед). Време на достава во последните 365 дена; статус и дестинација избрани псевдослучајно. |
| | 94 | |
| | 95 | === Delivery === |
| | 96 | Генерирана за секој ред од `OrderProduct` (join кон `"Order"` за `hotel_id`) - термин и статус на достава избрани случајно. |
| | 97 | |
| | 98 | ---- |
| | 99 | |
| | 100 | |
| | 101 | |
| | 102 | |