Split the server_status table into smaller tables
The server_status table is currently huge in size due to a lot of data in it. This sacrifices the quality of data, as well as the performance of queries. To improve these, I propose breaking down this into smaller tables.
CREATE TABLE "router"(
"fingerprint" VARCHAR(255) NOT NULL,
"is_bridge" BOOLEAN NOT NULL,
"nickname" VARCHAR(255) NOT NULL,
"first_seen" DATE NOT NULL,
"last_seen" DATE NOT NULL
);
ALTER TABLE
"router" ADD PRIMARY KEY("fingerprint");
CREATE TABLE "flag"(
"id" BIGINT NOT NULL,
"name" VARCHAR(255) NOT NULL
);
ALTER TABLE
"flag" ADD PRIMARY KEY("id");
CREATE TABLE "router_flag"(
"id" BIGINT NOT NULL,
"fingerprint" VARCHAR(255) NOT NULL,
"flag_id" BIGINT NOT NULL
);
ALTER TABLE
"router_flag" ADD PRIMARY KEY("id");
CREATE TABLE "router_details"(
"fingerprint" VARCHAR(255) NOT NULL,
"running" BOOLEAN NOT NULL,
"last_restarted" DATE NOT NULL,
"country" BIGINT NOT NULL,
"as_name" VARCHAR(255) NOT NULL,
"as_number" VARCHAR(255) NOT NULL,
"contact" VARCHAR(255) NOT NULL,
"is_hibernating" BOOLEAN NOT NULL
);
ALTER TABLE
"router_details" ADD PRIMARY KEY("fingerprint");
CREATE TABLE "country"(
"id" BIGINT NOT NULL,
"name" VARCHAR(255) NOT NULL
);
ALTER TABLE
"country" ADD PRIMARY KEY("id");
CREATE TABLE "router_version"(
"fingerprint" VARCHAR(255) NOT NULL,
"version" VARCHAR(255) NOT NULL,
"version_status" VARCHAR(255) NOT NULL,
"platform" VARCHAR(255) NOT NULL
);
ALTER TABLE
"router_version" ADD PRIMARY KEY("fingerprint");
CREATE TABLE "router_bandwidth"(
"fingerprint" VARCHAR(255) NOT NULL,
"current" BIGINT NOT NULL,
"advertised" BIGINT NOT NULL,
"avg" BIGINT NOT NULL,
"burst" BIGINT NOT NULL,
"observed" BIGINT NOT NULL,
"network_weight_fraction" BIGINT NOT NULL
);
ALTER TABLE
"router_bandwidth" ADD PRIMARY KEY("fingerprint");
CREATE TABLE "router_network"(
"fingerprint" VARCHAR(255) NOT NULL,
"socks_port" BIGINT NOT NULL,
"dir_port" BIGINT NOT NULL,
"or_port" BIGINT NOT NULL,
"address" VARCHAR(255) NOT NULL,
"or_address" VARCHAR(255) NOT NULL,
"diff_or_address" VARCHAR(255) NOT NULL,
"unreachable_or_addresses" VARCHAR(255) NOT NULL
);
ALTER TABLE
"router_network" ADD PRIMARY KEY("fingerprint");
CREATE TABLE "router_family"(
"host" VARCHAR(255) NOT NULL,
"declared" VARCHAR(255) NOT NULL
);
ALTER TABLE
"router_family" ADD PRIMARY KEY("host");
CREATE TABLE "router_policy"(
"fingerprint" VARCHAR(255) NOT NULL,
"exit_policy" VARCHAR(255) NOT NULL,
"ipv6_default_policy" VARCHAR(255) NOT NULL,
"ipv6_port_list" VARCHAR(255) NOT NULL,
"verified_hostnames" VARCHAR(255) NOT NULL,
"unverified_hostnames" VARCHAR(255) NOT NULL,
"transport_id" BIGINT NOT NULL,
"distribution_id" BIGINT NOT NULL,
"blocklist" VARCHAR(255) NOT NULL
);
ALTER TABLE
"router_policy" ADD PRIMARY KEY("fingerprint");
CREATE TABLE "distribution"(
"id" BIGINT NOT NULL,
"name" VARCHAR(255) NOT NULL
);
ALTER TABLE
"distribution" ADD PRIMARY KEY("id");
CREATE TABLE "transport"(
"id" BIGINT NOT NULL,
"name" VARCHAR(255) NOT NULL
);
ALTER TABLE
"transport" ADD PRIMARY KEY("id");
ALTER TABLE
"router_flag" ADD CONSTRAINT "router_flag_flag_id_foreign" FOREIGN KEY("flag_id") REFERENCES "flag"("id");
ALTER TABLE
"router_flag" ADD CONSTRAINT "router_flag_fingerprint_foreign" FOREIGN KEY("fingerprint") REFERENCES "router"("fingerprint");
ALTER TABLE
"router_family" ADD CONSTRAINT "router_family_declared_foreign" FOREIGN KEY("declared") REFERENCES "router"("fingerprint");
ALTER TABLE
"router" ADD CONSTRAINT "router_fingerprint_foreign" FOREIGN KEY("fingerprint") REFERENCES "router_bandwidth"("fingerprint");
ALTER TABLE
"router" ADD CONSTRAINT "router_fingerprint_foreign" FOREIGN KEY("fingerprint") REFERENCES "router_network"("fingerprint");
ALTER TABLE
"router_policy" ADD CONSTRAINT "router_policy_distribution_id_foreign" FOREIGN KEY("distribution_id") REFERENCES "distribution"("id");
ALTER TABLE
"router_details" ADD CONSTRAINT "router_details_country_foreign" FOREIGN KEY("country") REFERENCES "country"("id");
ALTER TABLE
"router" ADD CONSTRAINT "router_fingerprint_foreign" FOREIGN KEY("fingerprint") REFERENCES "router_details"("fingerprint");
ALTER TABLE
"router" ADD CONSTRAINT "router_fingerprint_foreign" FOREIGN KEY("fingerprint") REFERENCES "router_version"("fingerprint");
ALTER TABLE
"router" ADD CONSTRAINT "router_fingerprint_foreign" FOREIGN KEY("fingerprint") REFERENCES "router_family"("host");
ALTER TABLE
"router" ADD CONSTRAINT "router_fingerprint_foreign" FOREIGN KEY("fingerprint") REFERENCES "router_policy"("fingerprint");
ALTER TABLE
"router_policy" ADD CONSTRAINT "router_policy_transport_id_foreign" FOREIGN KEY("transport_id") REFERENCES "transport"("id");