我目前正在开发一款浏览器游戏。有一张地图,每个玩法至少有一个村庄。地图上的每个点要么是空的,要么被村庄使用。
我有一个地图表,其中列出了地图中的所有位置(空点和非空点)。
我的地图表:
CREATE TABLE map (
id serial NOT NULL,
x_pos integer NOT NULL,
y_pos integer NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (crop_type) REFERENCES. crop_types(id),
UNIQUE (x_pos, y_pos)
);
我的村庄表:
CREATE TABLE villages (
id serial NOT NULL,
name VARCHAR(256) NOT NULL,
population INT4 NOT NULL,
owner_id INT NOT NULL,
position_id INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (owner_id) REFERENCES users(id),
FOREIGN KEY (position_id) REFERENCES map(id)
);
所以每个村庄都有一个位置,但并不是每个位置都有一个村庄。现在,我不确定找到空位置或非空位置的正确方法是什么:
- 空:所有
map.ids
-villages.position_id
= 每个空点 - 非空:
villages.position_id
例子:
地图
ID | x_位置 | y_位置 |
---|---|---|
1 | 34 | 55 |
2 | 10 | 15 |
3 | 08 | 89 |
4 | 65 | 12 |
村庄
ID | 姓名 | 人口 | 位置 ID |
---|---|---|---|
1 | 伦敦 | 150 | 2 |
2 | 巴黎 | 320 | 3 |
更清楚地说,每个新用户都必须选择一个位置来建立他的村庄,当然,我只会给他们选择空位置的选项。
这是我可以实现的一个选项:向我的映射表添加一个新列,一个名为foreign_keyvillage_id
的列,它代表表id
中的列villages
。这将是一个选项 FK,因此该值可以是NULL
,因为如果地图位置是空闲的并且上面没有村庄,则该值village_id
将为NULL
。我对此选项的问题:
- 很多NULL
- 当一个点从空→非空时,我必须更新表
village_id
中的列map
。
地图
CREATE TABLE map (
id serial NOT NULL,
x_pos integer NOT NULL,
y_pos integer NOT NULL,
village_id INT, /* new column */
PRIMARY KEY (id),
FOREIGN KEY (crop_type) REFERENCES crop_types(id),
FOREIGN KEY (village_id) REFERENCES villages(id), /* new column details */
UNIQUE (x_pos, y_pos)
);
ID | x_位置 | y_位置 | 村庄ID |
---|---|---|---|
1 | 34 | 55 | NULL(空) |
2 | 10 | 15 | 1(伦敦) |
3 | 08 | 89 | 2(巴黎) |
4 | 65 | 12 | NULL(空) |
这是一个合适的选择吗?
在游戏过程中,很多疑问都会是“目前有哪些地点可以用来建立我的新村庄”