Skip to content

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.

drawSQL-image-export-2025-05-06

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");