[英]Creating SQL Tables for a Game's Leaderboard
這里的新手在為游戲排行榜連接一些表格時遇到了麻煩。 非常感謝幫助; 我有 3 個表:這是一個 ER 圖:
┌─────┐ ┌─────┐
│ IPs ├─||─────────────────|<─┤Names│
└──┬──┘ └──┬──┘
│ │
│ │
│ │
│ │
│ │
│ ┌──────┐ │
└─||───O<─┤Scores├─|O──────||─┘
└──────┘
基本上,我想讓每個IP
有多個name
,每個分數 map 到IP
的name
。
但是,我遇到了這個錯誤
ERROR: there is no unique constraint matching given keys for referenced table "names"
當我嘗試時:
CREATE TABLE IPs(
ip CIDR NOT NULL,
PRIMARY KEY(ip)
);
CREATE TABLE Names(
name VARCHAR(25) NOT NULL,
ip CIDR NOT NULL,
CONSTRAINT ip_fk FOREIGN KEY(ip) REFERENCES IPs(ip),
PRIMARY KEY(name, ip)
);
CREATE TABLE Scores(
score INT NOT NULL,
name VARCHAR(25) NOT NULL,
ip CIDR NOT NULL,
created_at TIMESTAMP NOT NULL,
CONSTRAINT name_fk FOREIGN KEY(name) REFERENCES Names(name),
CONSTRAINT ip_fk FOREIGN KEY(ip) REFERENCES IPs(ip),
PRIMARY KEY(score, name, ip)
);
我應該如何連接這些表?
您正在嘗試引用非唯一列。 在Scores
表中,您從Names
表中引用name
和ip
,它們組合起來是唯一的,但您分別引用它們。
我強烈建議向每個表添加自動增量標識符,而不是使用每列的組合作為主鍵。
主鍵應該是一個輕短的唯一值,用於標識整行,使用整行作為主鍵性能不佳,並使外鍵引用變得不必要地復雜,從而在數據庫中產生大量重復數據。
CREATE TABLE IPs(
id INT NOT NULL AUTO_INCREMENT,
ip CIDR NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE Names(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(25) NOT NULL,
ip INT NOT NULL,
CONSTRAINT ip_fk FOREIGN KEY(ip) REFERENCES IPs(id),
PRIMARY KEY(id)
);
在Scores
表中,不需要添加對IPs
表的引用,引用Names
表就足夠了,因為Names
表已經包含IPs
引用。
CREATE TABLE Scores(
id INT NOT NULL AUTO_INCREMENT,
score INT NOT NULL,
name INT NOT NULL,
created_at TIMESTAMP NOT NULL,
CONSTRAINT name_fk FOREIGN KEY(name) REFERENCES Names(id),
PRIMARY KEY(id)
);
我還找到了使用自然鍵的可能解決方案。 我沒有在Scores
中創建 2 個單獨的外鍵,而是創建了一個復合外鍵:
CREATE TABLE Scores(
score INT NOT NULL,
name VARCHAR(25) NOT NULL,
ip CIDR NOT NULL,
created_at TIMESTAMP NOT NULL,
CONSTRAINT fk FOREIGN KEY(name, ip) REFERENCES Names(name, ip),
PRIMARY KEY(score, name, ip)
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.