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-ови. |