Changes between Version 9 and Version 10 of RelationalDesign


Ignore:
Timestamp:
08/22/26 18:48:42 (5 days ago)
Author:
231118
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • RelationalDesign

    v9 v10  
    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)]]