首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL一对多表与多个一对一关系

SQL一对多表与多个一对一关系
EN

Stack Overflow用户
提问于 2011-08-25 06:25:50
回答 2查看 1.6K关注 0票数 1

我正在做一个具有以下目标的项目:用户可以创建一个挑战赛,并选择一个可选的竞争对手来参加这个挑战赛。挑战赛生成每日条目,并将跟踪这些条目的统计数据。

基本的用户和入口实体如下所示:

代码语言:javascript
运行
复制
CREATE TABLE users (
    id (INT),
    PRIMARY KEY (id)
);

CREATE TABLE entries (
    challengeId INT,
    userId INT,
    entryDate DATE,
    entryData VARCHAR,
    PRIMARY KEY (challengeId, userId, entryDate)
)

我遇到麻烦的是与之竞争的概念的挑战部分。我可以看到两种方法。

代码语言:javascript
运行
复制
// Hard code the concept of a Challenge Owner and Rival:
CREATE TABLE challenges (
    id INT,
    name VARCHAR,
    ownerId INT,
    rivalId INT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY (ownerId, name)
);

// Create Many-to-one relationship.
CREATE TABLE challenges (
    id INT,
    name VARCHAR,
    PRIMARY KEY (id),
    UNIQUE KEY (name)
)
CREATE TABLE participant (
    challengeId INT,
    userId INT,
    isOwner BIT,
    PRIMARY KEY (challengeId, userId)
)

第一种方法的问题是引用完整性很难,因为现在有两列userIds驻留(ownerId和rivalId)。我必须为所有内容(owner_entries、rival_entries、owner_stats等)创建两个表。以便设置外键。

第二种方法解决了这个问题,并具有一些优势,比如允许未来有多个竞争对手。然而,有一件事我不能再做了,那就是在单个用户而不是整个挑战表中强制质询名称的唯一性。此外,像寻找挑战赛的所有者这样的任务现在变得更加棘手。

挑战表的正确方法是什么?有没有办法以开发人员友好的方式设置这些表,或者我应该直接跳到类表继承并在那里管理所有者/竞争对手的概念?

EN

回答 2

Stack Overflow用户

发布于 2011-08-25 06:41:39

我认为我设置的方法如下(使用第二种方法):

代码语言:javascript
运行
复制
CREATE TABLE challenges (id INT, 
                         name VARCHAR, 
                         owner_id INT, 
                         PRIMARY KEY (id),
                         UNIQUE KEY (name, owner_id))

CREATE TABLE participant (challengeId INT,
                          userId INT, 
                          PRIMARY KEY (challengeId, userId))

这可以很容易地跟踪谁拥有挑战,同时还可以提取出单个参与者。

这也将允许您安全地由所有者唯一的质询名称,并且在participant中的userId上的外键很容易。因此,“‘Rivals”是指不是挑战赛所有者的所有参与者。

票数 1
EN

Stack Overflow用户

发布于 2011-08-25 06:33:34

我认为第一种方法是正确的。您可以有一张表供用户使用,另一张表供挑战使用。

你知道你可以像下面这样引用一个表两次吗?

代码语言:javascript
运行
复制
SELECT * FROM CHALLENGES 
INNER JOIN USERS AS OWNERS ON OWNERS.ID = CHALLENGES.OWNERID
INNER JOIN USERS AS RIVALS ON RIVALS.ID = CHALLENGES.RIVALID

在这种情况下,您可以同时引用竞争对手和所有者,而无需创建新表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7183060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档