163 lines
5.2 KiB
SQL
163 lines
5.2 KiB
SQL
-- CreateTable
|
|
CREATE TABLE "organizations" (
|
|
"id" TEXT NOT NULL,
|
|
"username" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"passwordHash" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "organizations_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "materials" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"category" TEXT NOT NULL,
|
|
"brand" TEXT,
|
|
"manufacturer" TEXT,
|
|
"spec" TEXT,
|
|
"envGrade" TEXT,
|
|
"usageUnit" TEXT NOT NULL DEFAULT 'm²',
|
|
"emissionParams" JSONB NOT NULL,
|
|
"isPublic" BOOLEAN NOT NULL DEFAULT false,
|
|
"ownerOrgId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "materials_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "projects" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"province" TEXT NOT NULL,
|
|
"city" TEXT NOT NULL,
|
|
"area" DOUBLE PRECISION NOT NULL,
|
|
"rating" TEXT,
|
|
"status" TEXT NOT NULL DEFAULT 'draft',
|
|
"isTemplate" BOOLEAN NOT NULL DEFAULT false,
|
|
"isPublic" BOOLEAN NOT NULL DEFAULT false,
|
|
"ownerOrgId" TEXT NOT NULL,
|
|
"reportGeneratedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "projects_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "spaces" (
|
|
"id" TEXT NOT NULL,
|
|
"projectId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"layout" TEXT NOT NULL DEFAULT 'uniform',
|
|
"height" DOUBLE PRECISION,
|
|
"area" DOUBLE PRECISION NOT NULL,
|
|
"volume" DOUBLE PRECISION NOT NULL,
|
|
"temperature" DOUBLE PRECISION NOT NULL,
|
|
"humidity" DOUBLE PRECISION NOT NULL,
|
|
"ventilationRate" DOUBLE PRECISION NOT NULL,
|
|
"standard" TEXT NOT NULL DEFAULT 'GB50325-2020',
|
|
"predictedConc" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "spaces_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "space_materials" (
|
|
"id" TEXT NOT NULL,
|
|
"spaceId" TEXT NOT NULL,
|
|
"materialId" TEXT NOT NULL,
|
|
"usageUnit" TEXT NOT NULL DEFAULT 'm²',
|
|
"usageAmount" DOUBLE PRECISION NOT NULL,
|
|
"contribution" JSONB,
|
|
"contributionRate" JSONB,
|
|
|
|
CONSTRAINT "space_materials_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "favorites" (
|
|
"id" TEXT NOT NULL,
|
|
"orgId" TEXT NOT NULL,
|
|
"targetType" TEXT NOT NULL,
|
|
"targetId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "favorites_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "reports" (
|
|
"id" TEXT NOT NULL,
|
|
"projectId" TEXT NOT NULL,
|
|
"rating" TEXT,
|
|
"payload" JSONB NOT NULL,
|
|
"generatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "reports_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "organizations_username_key" ON "organizations"("username");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "materials_category_idx" ON "materials"("category");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "materials_brand_idx" ON "materials"("brand");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "materials_envGrade_idx" ON "materials"("envGrade");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "materials_isPublic_idx" ON "materials"("isPublic");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "projects_ownerOrgId_idx" ON "projects"("ownerOrgId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "projects_isTemplate_isPublic_idx" ON "projects"("isTemplate", "isPublic");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "spaces_projectId_idx" ON "spaces"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "space_materials_spaceId_idx" ON "space_materials"("spaceId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "space_materials_materialId_idx" ON "space_materials"("materialId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "favorites_orgId_targetType_targetId_key" ON "favorites"("orgId", "targetType", "targetId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "reports_projectId_idx" ON "reports"("projectId");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "materials" ADD CONSTRAINT "materials_ownerOrgId_fkey" FOREIGN KEY ("ownerOrgId") REFERENCES "organizations"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "projects" ADD CONSTRAINT "projects_ownerOrgId_fkey" FOREIGN KEY ("ownerOrgId") REFERENCES "organizations"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "spaces" ADD CONSTRAINT "spaces_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "space_materials" ADD CONSTRAINT "space_materials_spaceId_fkey" FOREIGN KEY ("spaceId") REFERENCES "spaces"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "space_materials" ADD CONSTRAINT "space_materials_materialId_fkey" FOREIGN KEY ("materialId") REFERENCES "materials"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "favorites" ADD CONSTRAINT "favorites_orgId_fkey" FOREIGN KEY ("orgId") REFERENCES "organizations"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "reports" ADD CONSTRAINT "reports_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|