| 8 | | User(user_id, user_name, user_surname, email, password, role) |
| | 9 | user_id, user_name, user_surname, email, password, role, |
| | 10 | student_id, teacher_id, |
| | 11 | element_id, symbol, element_name, atomic_number, atomic_weight, melting_point, boiling_point, hazard_type, description_element, |
| | 12 | equipment_id, equipment_name, type, description, safety_info, |
| | 13 | reaction_id, r_teacher_id, element1_id, element2_id, product, conditions, |
| | 14 | experiment_id, e_teacher_id, reaction_fk, result, safety_warning, time_stamp, |
| | 15 | upe_user_id, upe_experiment_id, participation_timestamp, |
| | 16 | uve_user_id, uve_element_id, viewed_at_el, |
| | 17 | uvl_user_id, uvl_equipment_id, viewed_at_eq, |
| | 18 | eleq_experiment_id, eleq_equipment_id |
| | 19 | }}} |
| | 20 | } |
| | 22 | **Функциски зависности** |
| | 23 | |
| | 24 | User: |
| | 25 | {{{ |
| | 26 | user_id → user_name, user_surname, email, password, role; и email → user_id |
| | 27 | }}} (email е уникатен) |
| | 28 | |
| | 29 | Teacher/Student: |
| | 30 | {{{ |
| | 31 | teacher_id → (ref User) |
| | 32 | }}} |
| | 33 | , {{{ |
| | 34 | student_id → (ref User, teacher_id) |
| | 35 | }}} |
| | 36 | |
| | 37 | Elements: |
| | 38 | {{{ |
| | 39 | element_id → symbol, element_name, atomic_number, atomic_weight, melting_point, boiling_point, hazard_type, description_element; |
| | 40 | }}} |
| | 41 | и |
| | 42 | {{{ |
| | 43 | symbol → element_id (симбол е уникатен) |
| 33 | | labequipment(equipment_id, equipment_name, type, description, safety_info, teacher_id→User) |
| | 72 | (upe_user_id, upe_experiment_id) → participation_timestamp |
| | 73 | (uve_user_id, uve_element_id) → viewed_at_el |
| | 74 | (uvl_user_id, uvl_equipment_id) → viewed_at_eq |
| | 75 | (eleq_experiment_id, eleq_equipment_id) → (без не-клучни атрибути) |
| 38 | | {{{ |
| 39 | | reaction(reaction_id, teacher_id→User, element1_id→elements, element2_id→elements, product, conditions) |
| | 81 | User {user_id} (алтернативен {email}); Elements {element_id} (алтернативен {symbol}); LabEquipment {equipment_id} (алтернативен {equipment_name}); Reaction {reaction_id} (алтернативно тројката (e1,e2,conditions)); Experiment {experiment_id}; лог табели со композитни PK: {user_id,experiment_id}, {user_id,element_id}, {user_id,equipment_id}, {experiment_id,equipment_id}. |
| 51 | | {{{ |
| 52 | | experimentlabequipment(experiment_id→experiment, equipment_id→labequipment) |
| 53 | | |
| 54 | | }}} |
| 55 | | |
| 56 | | |
| 57 | | {{{ |
| 58 | | userparticipatesinexperiment(user_id→User, experiment_id→experiment[, participation_timestamp]) |
| 59 | | }}} |
| 60 | | |
| 61 | | |
| 62 | | * Tracking-табели (активности/прегледи): |
| 63 | | |
| 64 | | |
| 65 | | {{{ |
| 66 | | userviewselement(user_id→User, element_id→elements) |
| 67 | | }}} |
| 68 | | |
| 69 | | |
| 70 | | |
| 71 | | {{{ |
| 72 | | userviewslabequipment(user_id→User, equipment_id→labequipment) |
| 73 | | }}} |
| | 96 | Lossless преку PK/FK споеви (Experiment ⋈ Reaction по reaction_id, Student ⋈ User по student_id=user_id …). |
| | 97 | Dependency-preserving: сите ФЗ ги чуваме со PK/UNIQUE/CHECK/FK (email, symbol, equipment_name; (user_id,experiment_id); физички CHECK-ови), без глобални JOIN-ови. |