129 lines
3.9 KiB
SQL
129 lines
3.9 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "MarketType" AS ENUM ('US', 'CN', 'HK', 'CRYPTO');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "TransactionType" AS ENUM ('DEPOSIT', 'WITHDRAW', 'BUY', 'SELL', 'DIVIDEND', 'INTEREST', 'FEE');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "User" (
|
|
"id" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"name" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Account" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"marketType" "MarketType" NOT NULL,
|
|
"baseCurrency" TEXT NOT NULL,
|
|
"balance" DECIMAL(20,4) NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Account_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Security" (
|
|
"id" TEXT NOT NULL,
|
|
"symbol" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"market" "MarketType" NOT NULL,
|
|
"currency" TEXT NOT NULL,
|
|
"lotSize" INTEGER NOT NULL DEFAULT 1,
|
|
"priceDecimals" INTEGER NOT NULL DEFAULT 2,
|
|
"qtyDecimals" INTEGER NOT NULL DEFAULT 0,
|
|
"isCrypto" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Security_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Transaction" (
|
|
"id" TEXT NOT NULL,
|
|
"accountId" TEXT NOT NULL,
|
|
"type" "TransactionType" NOT NULL,
|
|
"symbol" TEXT,
|
|
"quantity" DECIMAL(20,8),
|
|
"price" DECIMAL(20,8),
|
|
"amount" DECIMAL(20,4) NOT NULL,
|
|
"fee" DECIMAL(20,4) NOT NULL DEFAULT 0,
|
|
"networkFee" DECIMAL(20,8),
|
|
"currency" TEXT NOT NULL,
|
|
"exchangeRate" DECIMAL(20,8),
|
|
"notes" TEXT,
|
|
"executedAt" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Transaction_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Position" (
|
|
"id" TEXT NOT NULL,
|
|
"accountId" TEXT NOT NULL,
|
|
"symbol" TEXT NOT NULL,
|
|
"quantity" DECIMAL(20,8) NOT NULL,
|
|
"averageCost" DECIMAL(20,8) NOT NULL,
|
|
"currency" TEXT NOT NULL,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Position_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ExchangeRate" (
|
|
"id" TEXT NOT NULL,
|
|
"fromCurrency" TEXT NOT NULL,
|
|
"toCurrency" TEXT NOT NULL,
|
|
"rate" DECIMAL(20,8) NOT NULL,
|
|
"effectiveDate" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ExchangeRate_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Account_userId_idx" ON "Account"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Security_symbol_key" ON "Security"("symbol");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Transaction_accountId_executedAt_idx" ON "Transaction"("accountId", "executedAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Transaction_symbol_idx" ON "Transaction"("symbol");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Position_accountId_idx" ON "Position"("accountId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Position_accountId_symbol_key" ON "Position"("accountId", "symbol");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ExchangeRate_fromCurrency_toCurrency_idx" ON "ExchangeRate"("fromCurrency", "toCurrency");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ExchangeRate_fromCurrency_toCurrency_effectiveDate_key" ON "ExchangeRate"("fromCurrency", "toCurrency", "effectiveDate");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Account" ADD CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Transaction" ADD CONSTRAINT "Transaction_accountId_fkey" FOREIGN KEY ("accountId") REFERENCES "Account"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Position" ADD CONSTRAINT "Position_accountId_fkey" FOREIGN KEY ("accountId") REFERENCES "Account"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|