Sql 我应该如何构造我的简单数据库?

Sql 我应该如何构造我的简单数据库?,sql,postgresql,database-design,Sql,Postgresql,Database Design,我正在创建一个数据库(用于在线游戏的数据),我需要在其中存储玩家及其村庄。每个玩家至少有一个村庄。所有村庄都是独一无二的,每个村庄只有一个所有者(玩家) 值得一提的是,我打算每天创建一个新的表,因为这个在线游戏每24小时发布一次更新的游戏世界数据文件。一旦创建了一个表,我就不必对它进行更改,我只需要从中读取数据 我现在想出了两个解决方案,但我不知道什么是正确的方法 解决方案1: CREATE TYPE village_t AS ( id INTEGER, x INTEGER,

我正在创建一个数据库(用于在线游戏的数据),我需要在其中存储玩家及其村庄。每个玩家至少有一个村庄。所有村庄都是独一无二的,每个村庄只有一个所有者(玩家)


值得一提的是,我打算每天创建一个新的表,因为这个在线游戏每24小时发布一次更新的游戏世界数据文件。一旦创建了一个表,我就不必对它进行更改,我只需要从中读取数据

我现在想出了两个解决方案,但我不知道什么是正确的方法

解决方案1:

CREATE TYPE village_t AS (
    id INTEGER,
    x INTEGER,
    y INTEGER,
    village_id INTEGER,
    village_name VARCHAR,
    pop INTEGER,
    region VARCHAR
);

CREATE TABLE players (
    tribe INTEGER NOT NULL,
    user_id INTEGER PRIMARY KEY,
    user_name VARCHAR(30) UNIQUE NOT NULL,
    aliance_id INTEGER NOT NULL,
    aliance_name VARCHAR(30) NOT NULL,
    villages village_t[]
);
解决方案2:

CREATE TABLE players (
    tribe INTEGER NOT NULL,
    user_id INTEGER PRIMARY KEY,
    user_name VARCHAR(30) UNIQUE NOT NULL,
    aliance_id INTEGER NOT NULL,
    aliance_name VARCHAR(30) NOT NULL
);

CREATE TABLE villages (
    id INTEGER NOT NULL,
    x INTEGER NOT NULL,
    y INTEGER NOT NULL,
    village_id INTEGER NOT NULL,
    village_name VARCHAR NOT NULL,
    user_id INTEGER,
    CONSTRAINT fk_con FOREIGN KEY(user_id) REFERENCES players(user_id),
    pop INTEGER NOT NULL,
    region VARCHAR
);

CREATE INDEX idx ON villages(user_id);

如果您需要经常读取村庄数据,建议不要使用解决方案1。这是因为村庄ID列表设计删除了连接person和village表的范围

解决方案2是最受欢迎的方式,因为它使您的所有选项保持开放状态(无论您是否经常需要村庄数据)

解决方案2的另一种方法是为用户id和村庄id创建一个交叉引用表

CREATE TABLE players (
    tribe INTEGER NOT NULL,
    user_id INTEGER PRIMARY KEY,
    user_name VARCHAR(30) UNIQUE NOT NULL,
    aliance_id INTEGER NOT NULL,
    aliance_name VARCHAR(30) NOT NULL
);

CREATE TABLE villages (
    id INTEGER NOT NULL,
    x INTEGER NOT NULL,
    y INTEGER NOT NULL,
    village_id INTEGER NOT NULL,
    village_name VARCHAR NOT NULL,
    pop INTEGER NOT NULL,
    region VARCHAR
);

CREATE TABLE xref_players_villages (
    user_id INTEGER,
    CONSTRAINT fk_con1 FOREIGN KEY(user_id) REFERENCES players(user_id),
    village_id INTEGER,
    CONSTRAINT fk_con2 FOREIGN KEY(village_id ) REFERENCES villages(village_id ),
);

你有一个1-n的关系。每个村庄(“n”)有一个所有者(“1”)。第二种解决方案是在数据库中存储此信息的规范方法

你的第一个解决方案甚至没有强制执行一个村庄作为一个所有者的概念,所以我不知道你为什么要考虑它。第二种方法将此条件作为数据模型的一部分


顺便说一句,您的第二个解决方案为您描述的内容设置了推荐外键和索引,因此看起来不错。

“我打算每天创建一个新表”-设计错误。我需要将数据保留至少14天,以便制作一些图表,统计等。我看不到任何其他方法可以每天为新的数据输入创建新表。不是一组每日表,而是在每个表中添加一列日期(时间戳)类型。考虑您的查询以创建每日图表/统计数据。该查询需要连接每天的表并合并所有14个集合。对于日期,您只需将日期添加到加入条件,但您只有1个加入。此外,您可以决定保留30天或2年,而不更改查询。如果你需要联合700多个会员,可以考虑尝试一下。谢谢你的回答谢谢你的回答