| | 8 | |
| | 9 | === 2. Перформанси и оптимизација |
| | 10 | - '''Стратегија на индексирање:''' Базата користи B-Tree индекси кои PostgreSQL автоматски ги креира за примарните клучеви(`PRIMARY KEY`) и уникатните ограничувања(`UNIQUE`). На тој начин е овозможен брз пристап до записите при пребарување по идентификатори на ентитетите, како и при проверка на единственоста на корисничките е-пошти. Индексите моментално постојат над колоните `user.user_id`, `user.email`, `transaction.transaction_id`, `transaction_account.transaction_account_id`, `transaction_breakdown.transaction_breakdown_id`, `tag.tag_id` и `tag_assigned_to_transaction.tag_assigned_to_transaction_id`. |
| | 11 | - '''Оптимизација преку релациски ограничувања:''' Сите врски помеѓу табелите се реализирани преку надворешни клучеви(`FOREIGN KEY`), со што PostgreSQL може ефикасно да го одржува интегритетот на податоците при вметнување, ажурирање и бришење на записи. |
| | 12 | - '''Подготвеност за понатамошна оптимизација:''' Со растот на количината на податоци, можно е дополнително индексирање на колони кои често се користат при филтрирање и поврзување на податоците, како што се `transaction.date`, `transaction_account.user_id`, `transaction_breakdown.transaction_id` и `tag_assigned_to_transaction.transaction_id`. Ваквата оптимизација е особено корисна кај статистичките извештаи и аналитичките прашалници кои обработуваат поголем број трансакции. |
| | 13 | |
| | 14 | |
| | 15 | === 3. Интегритет и конзистентност |
| | 16 | Со цел самата база да биде отпорна на грешки, имплементирани се стриктни ограничувања (`CONSTRAINTS`) кои се компатибилно пресликани и преку типовите во [source:/app/lib/definitions.ts]: |
| | 17 | {{{#!sql |
| | 18 | ALTER TABLE transaction_account |
| | 19 | DROP CONSTRAINT transaction_account_user_id_fkey; |
| | 20 | |
| | 21 | ALTER TABLE transaction_account |
| | 22 | ADD CONSTRAINT transaction_account_user_id_fkey |
| | 23 | FOREIGN KEY (user_id) |
| | 24 | REFERENCES "user"(user_id) |
| | 25 | ON DELETE CASCADE; |
| | 26 | }}} |
| | 27 | |
| | 28 | {{{#!sql |
| | 29 | ALTER TABLE transaction_breakdown |
| | 30 | DROP CONSTRAINT transaction_breakdown_transaction_id_fkey; |
| | 31 | |
| | 32 | ALTER TABLE transaction_breakdown |
| | 33 | ADD CONSTRAINT transaction_breakdown_transaction_id_fkey |
| | 34 | FOREIGN KEY (transaction_id) |
| | 35 | REFERENCES "transaction"(transaction_id) |
| | 36 | ON DELETE CASCADE; |
| | 37 | }}} |
| | 38 | |
| | 39 | {{{#!sql |
| | 40 | ALTER TABLE transaction_breakdown |
| | 41 | DROP CONSTRAINT transaction_breakdown_transaction_account_id_fkey; |
| | 42 | |
| | 43 | ALTER TABLE transaction_breakdown |
| | 44 | ADD CONSTRAINT transaction_breakdown_transaction_account_id_fkey |
| | 45 | FOREIGN KEY (transaction_account_id) |
| | 46 | REFERENCES transaction_account(transaction_account_id) |
| | 47 | ON DELETE CASCADE; |
| | 48 | }}} |
| | 49 | |
| | 50 | {{{#!sql |
| | 51 | ALTER TABLE "user" |
| | 52 | ADD CONSTRAINT user_email_unique UNIQUE (email); |
| | 53 | }}} |
| | 54 | - '''Надворешни клучеви и каскадно бришење:''' Сите релации помеѓу ентитетите се заштитени со надворешни клучеви(`FOREIGN KEY`). За зависните записи е конфигурирано каскадно бришење(`ON DELETE CASCADE`), со што се спречува појава на невалидни или неповрзани податоци. При бришење на корисник автоматски се отстрануваат неговите сметки и поврзаните записи за распределба на трансакции. На ист начин, при бришење на трансакција или таг, автоматски се бришат и зависните записи кои се поврзани со нив. |
| | 55 | - '''Ограничувања на уникатност:''' Корисничките мејлови се заштитени со `UNIQUE` ограничување, со што се гарантира дека во системот не можат да постојат два кориснички профили со иста емаил адреса. |
| | 56 | - '''Типови на податоци за финансиски вредности:''' Сите монетарни вредности во системот се складираат со типот `NUMERIC(10,2)`. Овој пристап обезбедува фиксна прецизност до две децимали и ги елиминира грешките кои можат да настанат при користење на типови со подвижна запирка(`FLOAT` или `DOUBLE PRECISION`) во финансиски пресметки. |
| | 57 | |
| | 58 | === 4. Одржување на базата |
| | 59 | - '''Зачувување на структурните промени:''' Секоја промена на структурата на базата се документира во Trac документацијата и се имплементира директно во PostgreSQL преку SQL наредби. На тој начин документацијата останува усогласена со реалната имплементација на системот. |
| | 60 | - '''Чување на SQL скриптите:''' Секоја SQL скрипта извршена после првата DDL скрипта ја чувам хронолошки, за во случај да треба базата да се иницијализира повторно, да ги извршам редоследно и да ја добијам истата состојба која сум ја имал. |
| | 61 | - '''Одговорност за инфраструктурата:''' FEiN е дизајниран да работи врз PostgreSQL сервер обезбеден од надворешна инфраструктура. Конфигурацијата на серверот, резервните копии и механизмите за обновување на податоците се надвор од опсегот на самата апликација и зависат од околината во која е поставена базата на податоци. |