% -*- coding: utf-8 -*- \section{Database layout} \begin{figure} \begin{center} \includegraphics[width=120mm]{database.eps}\\ \end{center} \label{database} \caption{Databasens indhold og et foreslået tabel design.} \end{figure} \begin{verbatim} Database designformål: - Hurtig skrivning af en transaktion. - Hurtig genfinding af en tidligere skrevet transaktion. - Robusthed overfor ændringer i makroers layout. - Gode muligheder for at lave statistik udtræk. Estimat af datastørrelser: 200 patienter pr. dag. 10 fields pr. patient. ---- 2000 fields + 200 headere = 2200 entries i databasen pr. dag. Hvis en entry i gennemsnit består af 200 tegn er det 2200 * 200 = 440000 bytes/dag. eller 153.16Mbytes/år // som root // # createuser -P -h localhost -U postgres // # createdb -U postgres -h localhost pracro CREATE DATABASE pracro WITH OWNER = pracro ENCODING = 'UNICODE' TABLESPACE = pg_default; CREATE TABLE transactions ( "cpr" varchar(255), "transaction" varchar(255), "makro" varchar(255), "version" varchar(255), "timestamp" varchar(255), "user" varchar(255) ) WITH OIDS; ALTER TABLE transactions OWNER TO pracro; CREATE TABLE fields ( "transaction" varchar(255), "name" varchar(255), "value" varchar(255) ) WITH OIDS; ALTER TABLE fields OWNER TO pracro; // Get all matching fields SELECT transactions.timestamp, transactions.transaction, fields.name, fields.value FROM transactions, fields WHERE transactions.cpr='2003791613' AND transactions.transaction=fields.transaction AND fields.name='fisk'; transactionid skal bygges af unixtime-pid-commit_idx inkl. "-"erne. \end{verbatim} %// Get latest matching field %SELECT fields.value, MAX(transactions.timestamp) % FROM fields, transactions % WHERE transactions.cpr='2003791613' % AND transactions.transaction=fields.transaction % AND fields.name='fisk' % GROUP BY fields.value; % %SELECT fields.name, fields.value, transactions.timestamp FROM transactions, fields % WHERE transactions.transaction=(SELECT MAX(transactions.timestamp) as ts % FROM fields, transactions % WHERE transactions.cpr='2003791613' % AND transactions.transaction=fields.transaction % AND fields.name='fisk') % AND fields.name='fisk'; % %SELECT name, value, timestamp FROM transactions, fields, %(SELECT transactions.transaction, MAX(transactions.timestamp) % FROM fields, transactions % WHERE transactions.cpr='2003791613' % AND transactions.transaction=fields.transaction % AND fields.name='fisk' % GROUP BY transactions.transaction) max % WHERE transactions.timestamp=max.max % AND transactions.transaction=max.transaction % AND fields.name='fisk'; % %AAAAAAAAAARGH