| 1 | | == Релациско мапирање == |
| 2 | | |
| 3 | | === Ознаки === |
| 4 | | |
| 5 | | Во продолжение се користат следните конвенции при опишување на релациското мапирање: |
| 6 | | |
| 7 | | * Секој примарен клуч е визуелно означен со болдирање и подвлекување и е означен како '''__PK__'''. |
| 8 | | * Атрибутите кои претставуваат надворешни клучеви се означени со '''FK*''', при што во заграда е наведена табелата и атрибутот кон кој се врши референцирање. |
| 9 | | * Атрибутите кои мора задолжително да имаат вредност (NOT NULL) се болдирани. |
| 10 | | * Атрибутите со услов за единственост во рамки на табелата се дополнително означени со '''(UNIQUE)'''. |
| 11 | | * За составна единственост (composite unique) се користи ознака: '''(UNIQUE: A + B)'''. |
| 12 | | |
| 13 | | Овие ознаки овозможуваат појасно разбирање на структурата на базата на податоци и релациите помеѓу табелите. |
| 14 | | |
| 15 | | |
| 16 | | |
| 17 | | === Табели === |
| 18 | | |
| 19 | | 1. '''Tenants''' |
| 20 | | ('''__id PK__''', '''name''', '''owner_email''', '''created_at''') |
| 21 | | |
| 22 | | 2. '''Users''' |
| 23 | | ('''__id PK__''', '''email''' (UNIQUE), name, picture, '''created_at''') |
| 24 | | |
| 25 | | 3. '''Memberships''' |
| 26 | | ('''__user_id PK__ FK*(Users.id)''', '''__tenant_id PK__ FK*(Tenants.id)''', role, created_at) |
| 27 | | *Забелешка:* Memberships има составен примарен клуч: (user_id, tenant_id). |
| 28 | | |
| 29 | | 4. '''Environments''' |
| 30 | | ('''__id PK__''', '''tenant_id FK*(Tenants.id)''', '''name''', '''created_at''', (UNIQUE: tenant_id + name)) |
| 31 | | |
| 32 | | 5. '''ENV_Tokens''' |
| 33 | | ('''__id PK__''', '''tenant_id FK*(Tenants.id)''', '''env_name''', '''token''' (UNIQUE), '''created_at''', expires_at) |
| 34 | | |
| 35 | | 6. '''Computers''' |
| 36 | | ('''__id PK__''', '''tenant_id FK*(Tenants.id)''', '''env_name''', '''name''', user, ip, os, first_seen, last_seen, sysmon_available, (UNIQUE: tenant_id + name)) |
| 37 | | |
| 38 | | 7. '''Computer_history''' |
| 39 | | ('''__id PK__''', '''computer_id FK*(Computers.id)''', cpu_usage, ram_usage, disk_usage, network_sent_mb, network_recv_mb, timestamp) |
| 40 | | |
| 41 | | 8. '''Computer_processes_current''' |
| 42 | | ('''__id PK__''', '''computer_id FK*(Computers.id)''', pid, name, cpu_percent, memory_mb, username, cmdline, timestamp) |
| 43 | | |
| 44 | | 9. '''Computer_processes_history''' |
| 45 | | ('''__id PK__''', '''computer_id FK*(Computers.id)''', pid, name, cpu_percent, memory_mb, username, cmdline, timestamp) |
| 46 | | |
| 47 | | 10. '''Sysmon_events''' |
| 48 | | ('''__id PK__''', '''computer_id FK*(Computers.id)''', event_id, event_type, message, timestamp, details) |
| 49 | | |
| 50 | | 11. '''Network_connections''' |
| 51 | | ('''__id PK__''', '''computer_id FK*(Computers.id)''', pid, local_address, remote_address, status, process_name, timestamp) |
| 52 | | |
| 53 | | 12. '''Security_alerts''' |
| 54 | | ('''__id PK__''', '''computer_id FK*(Computers.id)''', alert_type, severity, description, timestamp, resolved) |
| 55 | | |
| 56 | | 13. '''Env_settings''' |
| 57 | | ('''__tenant_id PK__ FK*(Tenants.id)''', '''__env_name PK__''', save_process_history, created_at, updated_at) |
| 58 | | |
| 59 | | |
| 60 | | |
| 61 | | === Забелешки за дизајнот === |
| 62 | | |
| 63 | | * Табелата '''Computer_processes_current''' содржи само моментална snapshot состојба на процесите. |
| 64 | | * Табелата '''Computer_processes_history''' се користи само ако е овозможено снимање на историја преку '''Env_settings'''. |
| 65 | | * Табелата '''Env_settings''' овозможува конфигурација по environment без потреба од глобални флагови. |
| 66 | | * Не се користи посебна табела за admin sessions – автентикацијата се реализира преку JWT cookie. |
| 67 | | |
| 68 | | |
| 69 | | |
| 70 | | === DDL скрипта за креирање на табелите === |
| 71 | | [attachment:ddl_sql.sql ddl_sql.sql] |
| 72 | | |
| 73 | | === DML скрипта за полнење на табелите со податоци === |
| 74 | | [attachment:dml.sql dml.sql] |
| 75 | | |
| 76 | | |
| 77 | | |
| 78 | | === Релациски дијаграм === |
| 79 | | |
| 80 | | [[Image(lan_logs_sysmon.png)]] |
| | 1 | = Relational Design = |
| | 2 | Релацискиот модел е добиен со '''делумна трансформација''' (partial transformation) на ЕР-моделот: секој ентитет е мапиран во посебна релација, врската M:N (Users–Tenants) е реализирана со посебна релација (Memberships), врските 1:N со надворешен клуч на страната „повеќе", а врската 1:1 (Environments–Env_settings) со заеднички клуч. Делумната трансформација е избрана бидејќи ентитетите имаат јасни, стабилни идентификатори и нема потреба од спојување на релации. |
| | 3 | == Descriptive representation of the relational schema == |
| | 4 | Ознаки: примарен клуч е подвлечен (__...__); надворешен клуч е означен со стрелка (→ табела). Составен надворешен клуч се однесува на групата атрибути во заграда. |
| | 5 | * '''tenants'''(__id__, name, owner_email, created_at) |
| | 6 | * '''users'''(__id__, email (UNIQUE), name, picture, created_at) |
| | 7 | * '''memberships'''(__user_id__ → users, __tenant_id__ → tenants, role, created_at) |
| | 8 | * '''environments'''(__id__, tenant_id → tenants, name, created_at); UNIQUE(tenant_id, name) |
| | 9 | * '''env_tokens'''(__id__, (tenant_id, env_name) → environments(tenant_id, name), token (UNIQUE), created_at, expires_at) |
| | 10 | * '''env_settings'''(__tenant_id__, __env_name__, save_process_history, save_metrics_history, save_network_history, created_at, updated_at); (tenant_id, env_name) → environments(tenant_id, name) |
| | 11 | * '''networks'''(__id__, (tenant_id, env_name) → environments(tenant_id, name), name, cidr, gateway_ip, vlan); UNIQUE(tenant_id, name) |
| | 12 | * '''computer_groups'''(__id__, tenant_id → tenants, name, description, parent_id → computer_groups); UNIQUE(tenant_id, name) |
| | 13 | * '''computers'''(__id__, (tenant_id, env_name) → environments(tenant_id, name), name, user, ip, os, first_seen, last_seen, sysmon_available, network_id → networks, group_id → computer_groups); UNIQUE(tenant_id, name) |
| | 14 | * '''network_devices'''(__id__, network_id → networks, name, device_type, ip, mac, status) |
| | 15 | * '''computer_history_current'''(__id__, computer_id → computers, cpu_usage, ram_usage, disk_usage, network_sent_mb, network_recv_mb, timestamp) |
| | 16 | * '''computer_history'''(__id__, computer_id → computers, cpu_usage, ram_usage, disk_usage, network_sent_mb, network_recv_mb, timestamp) |
| | 17 | * '''computer_processes_current'''(__id__, computer_id → computers, pid, name, cpu_percent, memory_mb, username, cmdline, timestamp) |
| | 18 | * '''computer_processes_history'''(__id__, computer_id → computers, pid, name, cpu_percent, memory_mb, username, cmdline, timestamp) |
| | 19 | * '''network_connections_current'''(__id__, computer_id → computers, pid, local_address, remote_address, status, process_name, timestamp) |
| | 20 | * '''network_connections_history'''(__id__, computer_id → computers, pid, local_address, remote_address, status, process_name, timestamp) |
| | 21 | * '''network_services'''(__id__, computer_id → computers, service_name, port, protocol, status, last_checked); UNIQUE(computer_id, port, protocol) |
| | 22 | * '''service_availability'''(__id__, service_id → network_services, is_available, response_time_ms, timestamp) |
| | 23 | * '''sysmon_events'''(__id__, computer_id → computers, event_id, event_type, message, timestamp, details) |
| | 24 | * '''security_alerts'''(__id__, computer_id → computers, alert_type, severity, description, timestamp, resolved) |
| | 25 | Забелешка: до tenant за computers, env_tokens, env_settings и networks се стигнува транзитивно преку environments (составен клуч tenant_id + env_name), а не со директна врска кон tenants — усогласено со ЕР-моделот (релациите „contains", „issues", „configured_by", „has_networks"). |
| | 26 | == DDL script for creating the database schema and objects == |
| | 27 | Скриптата ја (ре-)креира схемата project со сите табели, клучеви и ограничувања. Работи и на празна база и на база каде објектите веќе постојат (прво DROP SCHEMA ... CASCADE, потоа повторно креирање). |
| | 28 | [attachment:schema_creation.sql schema_creation.sql] |
| | 29 | == DML script for filling tables with data == |
| | 30 | Скриптата ги (ре-)полни сите табели. Работи и на празни табели и на табели што веќе содржат податоци (прво TRUNCATE ... RESTART IDENTITY CASCADE, потоа вметнување). |
| | 31 | [attachment:data_load.sql data_load.sql] |
| | 32 | == Relational diagram == |
| | 33 | Релацискиот дијаграм е изработен во DBeaver врз схемата project, со crow's-foot нотација, со распоред на табелите усогласен со ЕР-дијаграмот од претходната фаза. |
| | 34 | [[Image(relational_schema.jpg)]] |