Version 1 (modified by 6 hours ago) ( diff ) | ,
---|
Оптимизација
Интегритетни ограничувања (UNIQUE, CHECK)
За да спречиме аномалии и дупликати, додадовме:
-- UNIQUE: деловни правила ALTER TABLE "User" ADD CONSTRAINT uq_user_email UNIQUE (email); ALTER TABLE "User" ADD CONSTRAINT uq_user_username UNIQUE (username); ALTER TABLE "Instructor" ADD CONSTRAINT uq_instr_email UNIQUE (instructor_email); ALTER TABLE "Training" ADD CONSTRAINT uq_training_name UNIQUE (training_name); ALTER TABLE "Package" ADD CONSTRAINT uq_package_name UNIQUE (package_name); ALTER TABLE "Merch_Items" ADD CONSTRAINT uq_merch_item UNIQUE (item_name); -- "Slot" уникатност: спречува дупликат термини/локации ALTER TABLE "Class" ADD CONSTRAINT uq_class_slot UNIQUE (date, start_time, location, instructor_id); ALTER TABLE "Event" ADD CONSTRAINT uq_event_slot UNIQUE (event_name, date, time, location); -- CHECK: едноставни бизнис правила ALTER TABLE "Class" ADD CONSTRAINT ck_class_time_order CHECK (end_time > start_time), ADD CONSTRAINT ck_class_capacity_nonneg CHECK (capacity IS NULL OR capacity >= 0), ADD CONSTRAINT ck_seats_not_overflow CHECK (seats_available IS NULL OR capacity IS NULL OR seats_available <= capacity), ADD CONSTRAINT ck_seats_nonneg CHECK (seats_available IS NULL OR seats_available >= 0); ALTER TABLE "Package" ADD CONSTRAINT ck_package_price_pos CHECK (price > 0), ADD CONSTRAINT ck_package_num_pos CHECK (num_classes > 0); ALTER TABLE "Merch_Items" ADD CONSTRAINT ck_merch_price_pos CHECK (price > 0);
Забелешка: при обид за дупликат UNIQUE, PostgreSQL враќа грешка 23505 (unique violation) – тоа во апликацијата го прикажуваме како “Email already taken”, итн.
Индекси за перформанси
Индекси на мостови (по „другата“ страна од PK, за побрзи филтри):
CREATE INDEX IF NOT EXISTS idx_ubc_class ON "User_Booked_Class"(class_id); CREATE INDEX IF NOT EXISTS idx_cht_training ON "Class_Includes_Training"(training_id); CREATE INDEX IF NOT EXISTS idx_ue_event ON "User_Event"(event_id); CREATE INDEX IF NOT EXISTS idx_upp_package ON "User_Purchased_Package"(package_id); CREATE INDEX IF NOT EXISTS idx_upm_merch ON "User_Purchased_Merch"(merch_id); CREATE INDEX IF NOT EXISTS idx_pic_class ON "Package_Includes_Class"(class_id);
Индекси за честите листања:
CREATE INDEX IF NOT EXISTS idx_event_date_time ON "Event"(date, time); CREATE INDEX IF NOT EXISTS idx_class_date_time ON "Class"(date, start_time);
Заклучок
Со декомпозиција по ентитети и мостови ги елиминиравме транзитивните зависности и постигнавме 3NФ/BCNF. UNIQUE/CHECK ограничувањата ги зацврстуваат бизнис правилата, а индексирањето ги забрзува најчестите барања (листaње часови/настани и повратни врски преку мостовите).
Note:
See TracWiki
for help on using the wiki.