簡體   English   中英

為游戲排行榜創建 SQL 表

[英]Creating SQL Tables for a Game's Leaderboard

這里的新手在為游戲排行榜連接一些表格時遇到了麻煩。 非常感謝幫助; 我有 3 個表:這是一個 ER 圖:

   ┌─────┐                       ┌─────┐
   │ IPs ├─||─────────────────|<─┤Names│
   └──┬──┘                       └──┬──┘
      │                             │
      │                             │
      │                             │
      │                             │
      │                             │
      │         ┌──────┐            │
      └─||───O<─┤Scores├─|O──────||─┘
                └──────┘

基本上,我想讓每個IP有多個name ,每個分數 map 到IPname

但是,我遇到了這個錯誤

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表中引用nameip ,它們組合起來是唯一的,但您分別引用它們。

我強烈建議向每個表添加自動增量標識符,而不是使用每列的組合作為主鍵。

主鍵應該是一個輕短的唯一值,用於標識整行,使用整行作為主鍵性能不佳,並使外鍵引用變得不必要地復雜,從而在數據庫中產生大量重復數據。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM