Останати теми: Безбедност, перформанси и одржување на базата
1. Безбедност на ниво на база
Имплементирани се следните безбедносни механизми директно при комуникацијата со базата, со што се намалува нападниот вектор независно од самиот NextJS сервер:
- Заштита од SQL вбризгување(SQL injection): Клиентската библиотека
postgres.jsкористи параметризирани прашалници преку Tagged Template Literals(на примерsql\...\) по дизајн. Ова спречува директно извршување на малициозен SQL код преку корисничките влезни параметри, бидејќи влезот е секогаш парсиран како податок, а не како команда. - Енкриптирана комуникација(SSL/TLS): Како што е наведено во конфигурацискиот фајл(app/lib/db.ts#L11), конекцијата кон базата строго наметнува SSL сертификат преку параметарот
ssl: 'require'. Ова ја штити транзицијата на чувствителните податоци и лозинки од "man-in-the-middle" напади. - Безбедно поврзување со база: Конекциските стрингови никогаш не се чуваат во изворниот код. Тие се изолирани преку заштитени околински променливи (
POSTGRES_URL).
2. Перформанси и оптимизација
- Стратегија на индексирање: Базата користи 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. - Оптимизација преку релациски ограничувања: Сите врски помеѓу табелите се реализирани преку надворешни клучеви(
FOREIGN KEY), со што PostgreSQL може ефикасно да го одржува интегритетот на податоците при вметнување, ажурирање и бришење на записи. - Подготвеност за понатамошна оптимизација: Со растот на количината на податоци, можно е дополнително индексирање на колони кои често се користат при филтрирање и поврзување на податоците, како што се
transaction.date,transaction_account.user_id,transaction_breakdown.transaction_idиtag_assigned_to_transaction.transaction_id. Ваквата оптимизација е особено корисна кај статистичките извештаи и аналитичките прашалници кои обработуваат поголем број трансакции.
3. Интегритет и конзистентност
Со цел самата база да биде отпорна на грешки, имплементирани се стриктни ограничувања (CONSTRAINTS) кои се компатибилно пресликани и преку типовите во app/lib/definitions.ts:
ALTER TABLE transaction_account DROP CONSTRAINT transaction_account_user_id_fkey; ALTER TABLE transaction_account ADD CONSTRAINT transaction_account_user_id_fkey FOREIGN KEY (user_id) REFERENCES "user"(user_id) ON DELETE CASCADE;
ALTER TABLE transaction_breakdown DROP CONSTRAINT transaction_breakdown_transaction_id_fkey; ALTER TABLE transaction_breakdown ADD CONSTRAINT transaction_breakdown_transaction_id_fkey FOREIGN KEY (transaction_id) REFERENCES "transaction"(transaction_id) ON DELETE CASCADE;
ALTER TABLE transaction_breakdown DROP CONSTRAINT transaction_breakdown_transaction_account_id_fkey; ALTER TABLE transaction_breakdown ADD CONSTRAINT transaction_breakdown_transaction_account_id_fkey FOREIGN KEY (transaction_account_id) REFERENCES transaction_account(transaction_account_id) ON DELETE CASCADE;
ALTER TABLE "user" ADD CONSTRAINT user_email_unique UNIQUE (email);
- Надворешни клучеви и каскадно бришење: Сите релации помеѓу ентитетите се заштитени со надворешни клучеви(
FOREIGN KEY). За зависните записи е конфигурирано каскадно бришење(ON DELETE CASCADE), со што се спречува појава на невалидни или неповрзани податоци. При бришење на корисник автоматски се отстрануваат неговите сметки и поврзаните записи за распределба на трансакции. На ист начин, при бришење на трансакција или таг, автоматски се бришат и зависните записи кои се поврзани со нив. - Ограничувања на уникатност: Корисничките мејлови се заштитени со
UNIQUEограничување, со што се гарантира дека во системот не можат да постојат два кориснички профили со иста емаил адреса. - Типови на податоци за финансиски вредности: Сите монетарни вредности во системот се складираат со типот
NUMERIC(10,2). Овој пристап обезбедува фиксна прецизност до две децимали и ги елиминира грешките кои можат да настанат при користење на типови со подвижна запирка(FLOATилиDOUBLE PRECISION) во финансиски пресметки.
4. Одржување на базата
- Зачувување на структурните промени: Секоја промена на структурата на базата се документира во Trac документацијата и се имплементира директно во PostgreSQL преку SQL наредби. На тој начин документацијата останува усогласена со реалната имплементација на системот.
- Чување на SQL скриптите: Секоја SQL скрипта извршена после првата DDL скрипта ја чувам хронолошки, за во случај да треба базата да се иницијализира повторно, да ги извршам редоследно и да ја добијам истата состојба која сум ја имал.
- Одговорност за инфраструктурата: FEiN е дизајниран да работи врз PostgreSQL сервер обезбеден од надворешна инфраструктура. Конфигурацијата на серверот, резервните копии и механизмите за обновување на податоците се надвор од опсегот на самата апликација и зависат од околината во која е поставена базата на податоци.
Last modified
15 hours ago
Last modified on 06/16/26 12:57:11
Note:
See TracWiki
for help on using the wiki.
