CREATE TABLE Organisations ( OrganisationalId INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, Name TEXT NOT NULL COLLATE nocase, FullAddress TEXT NOT NULL COLLATE nocase, PostCode TEXT NOT NULL COLLATE nocase ); CREATE TABLE AgeRanges ( AgeRangeId INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, AgeRangeString TEXT NOT NULL UNIQUE ); INSERT INTO AgeRanges (AgeRangeString) VALUES ('20-35'); INSERT INTO AgeRanges (AgeRangeString) VALUES ('35-50'); INSERT INTO AgeRanges (AgeRangeString) VALUES ('50+'); CREATE TABLE Customers ( CustomerId INTEGER PRIMARY KEY UNIQUE NOT NULL, UserName TEXT NOT NULL UNIQUE, AgeRange_FK INTEGER NOT NULL, PostCode TEXT NOT NULL, FOREIGN KEY (AgeRange_FK) REFERENCES AgeRanges (AgeRangeId) ); CREATE TABLE Users ( UserId INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, CustomerId_FK INTEGER UNIQUE, OrganisationalId_FK INTEGER UNIQUE, Email TEXT NOT NULL UNIQUE, JoinDate INTEGER NOT NULL, HashedPassword TEXT NOT NULL, FOREIGN KEY (CustomerId_FK) REFERENCES Customers (CustomerId), FOREIGN KEY (OrganisationalId_FK) REFERENCES Organisations (OrganisationalId), CHECK ((CustomerId_FK NOTNULL AND OrganisationalId_FK ISNULL) OR (CustomerId_FK ISNULL AND OrganisationalId_FK NOTNULL)) ); CREATE TABLE Transactions ( TransactionId INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, BuyerUserId_FK INTEGER NOT NULL, SellerOrganisationId_FK INTEGER NOT NULL, ValueMicroCurrency INTEGER NOT NULL, ProofImage TEXT NOT NULL UNIQUE, TimeDateSubmitted INTEGER NOT NULL, FOREIGN KEY (BuyerUserId_FK) REFERENCES Users (UserId), FOREIGN KEY (SellerOrganisationId_FK) REFERENCES Organisations (OrganisationalId) ); CREATE TABLE AccountTokens ( AccountTokenId INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, AccountTokenName TEXT UNIQUE NOT NULL, Used INTEGER NOT NULL DEFAULT 0 ); CREATE TABLE SessionTokens ( SessionTokenId INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, SessionTokenName TEXT UNIQUE NOT NULL, UserIdAssignedTo_FK INTEGER NOT NULL, ExpireDateTime INTEGER NOT NULL, FOREIGN KEY (UserIdAssignedTo_FK) REFERENCES Users (UserId) ); CREATE TABLE PendingOrganisations ( PendingOrganisationId INTEGER PRIMARY KEY UNIQUE NOT NULL, UserSubmitted_FK INTEGER NOT NULL, TimeDateSubmitted INTEGER NOT NULL, Name TEXT NOT NULL COLLATE nocase, FullAddress TEXT COLLATE nocase, Postcode TEXT COLLATE nocase, FOREIGN KEY (UserSubmitted_FK) REFERENCES Users (UserId) ); CREATE TABLE PendingTransactions ( PendingTransactionId INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, BuyerUserId_FK INTEGER NOT NULL, PendingSellerOrganisationId_FK INTEGER NOT NULL, ValueMicroCurrency INTEGER NOT NULL, ProofImage TEXT NOT NULL UNIQUE, TimeDateSubmitted INTEGER NOT NULL, FOREIGN KEY (BuyerUserId_FK) REFERENCES Users (UserId), FOREIGN KEY (PendingSellerOrganisationId_FK) REFERENCES PendingOrganisations (PendingOrganisationId) ); CREATE TABLE Administrators ( UserId INTEGER PRIMARY KEY UNIQUE NOT NULL, FOREIGN KEY (UserId) REFERENCES Users (UserId) );