我正在做一个具有以下目标的项目:用户可以创建一个挑战赛,并选择一个可选的竞争对手来参加这个挑战赛。挑战赛生成每日条目,并将跟踪这些条目的统计数据。
基本的用户和入口实体如下所示:
CREATE TABLE users (
id (INT),
PRIMARY KEY (id)
);
CREATE TABLE entries (
challengeId INT,
userId INT,
entryDate DATE,
entryData VARCHAR,
PRIMARY KEY (challengeId, userId, entryDate)
)
我遇到麻烦的是与之竞争的概念的挑战部分。我可以看到两种方法。
// 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等)创建两个表。以便设置外键。
第二种方法解决了这个问题,并具有一些优势,比如允许未来有多个竞争对手。然而,有一件事我不能再做了,那就是在单个用户而不是整个挑战表中强制质询名称的唯一性。此外,像寻找挑战赛的所有者这样的任务现在变得更加棘手。
挑战表的正确方法是什么?有没有办法以开发人员友好的方式设置这些表,或者我应该直接跳到类表继承并在那里管理所有者/竞争对手的概念?
发布于 2011-08-25 06:41:39
我认为我设置的方法如下(使用第二种方法):
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”是指不是挑战赛所有者的所有参与者。
发布于 2011-08-25 06:33:34
我认为第一种方法是正确的。您可以有一张表供用户使用,另一张表供挑战使用。
你知道你可以像下面这样引用一个表两次吗?
SELECT * FROM CHALLENGES
INNER JOIN USERS AS OWNERS ON OWNERS.ID = CHALLENGES.OWNERID
INNER JOIN USERS AS RIVALS ON RIVALS.ID = CHALLENGES.RIVALID
在这种情况下,您可以同时引用竞争对手和所有者,而无需创建新表。
https://stackoverflow.com/questions/7183060
复制相似问题