以下图片是我目前所拥有的。
What I have so far http://i49.tinypic.com/10f3pjo.jpg
发射器有自己的属性,例如位置(就x和y而言),id,级别以及上次更新此信息的时间。更重要的是,任何氏族成员都可以保护排放者。发射器可以仅由该战队的成员进行防御。一个发射器可以被许多玩家捍卫。
或者更确切地说,是氏族成员。该表特别包含有关玩家的信息。这也有x和y的位置以及关于该玩家的其他信息。 (我可能也会在这里添加lastupdated)一个玩家可以防御多个发射器。
此表包含一个emitter_player组合。 (提供一种这样的关系)让我首先问一下,这是发射器和玩家之间的正确关系吗?我认为这将是多对多的。现在,我可以让自己变得简单,只需在这个连接表中添加防御点(我真正关心的是玩家在特定发射器中有多少“防御”)这也是正确的事情吗?但是,我想“第一次就做好”并添加一个玩家为这个发射器辩护的每个特定单位的信息。
此表包含有关游戏中所有单位的信息。此表具有单位ID,它与防御性和冒犯性值相关联。这个表很少被插入,当它(游戏中添加了新单位)时,它将被手动更新。
发射器不包含玩家以外的单位。玩家必须是发射器中每个单元的所有者。因此,发射器和单元之间没有关系。此外,虽然玩家可能在发射器之外有单位,但我并不关心这个例子。我只关心发射器中的单元。所以,我认为Emitter_Player连接表和Units表之间存在多对多的关系。我的理由是,Emitter_Player组合可以很容易地拥有许多不同类型的单位,而一种类型的单位可以有许多不同的Emitter_Player组合。
有两个连接表,我现在对如何将信息插入此数据库感到非常困惑。
同样,我极度失去了如何从这个数据库中访问信息。
我想最终创建图表(来自玩家和发射者),显示他们随时间的进展。我怎么会查询这个我不知道。
我希望能告诉玩家自上周以来他们是否取得了进展或取得了进展。 (在这种情况下,标记它们以供审查)
我尽量详细说明,如果您需要更多信息,请告诉我。我希望尽快完成这项工作,我真的完全失去了任何想法。
答案 0 :(得分:1)
你有一个相当不错的开始,但我建议一些建议:
在我看来,您可以将emitters_has_players_has_units
表合并到emitters_has_players
表中。只需将unit_id
作为emitters_has_players
主键中的第三个组成部分:
您还会注意到我为特定的quantity
关联添加了emitter-player-unit
列。这对于跟踪特定玩家对特定发射器具有多少特定单位是必要的。
在整个数据库中保持列名一致也是一种好习惯。您最初为id列命名的方式非常长(因为它包括完整的表名作为前缀)。
以下是一些如何查询上述设计的示例:
-- Get all associated emitters of a particular player
SELECT a.*
FROM emitters a
JOIN
(
SELECT DISTINCT emitter_id
FROM emitters_has_players
WHERE player_id = 1
) b ON a.emitter_id = b.emitter_id
-- Get all players associated with a particular emitter
SELECT a.*
FROM players a
JOIN
(
SELECT DISTINCT player_id
FROM emitters_has_players
WHERE emitter_id = 1
) b ON a.player_id = b.player_id
-- Get the count of players for a particular emitter
SELECT COUNT(DISTINCT player_id) AS player_count
FROM emitters_has_players
WHERE emitter_id = 1
-- Get all units associated with a particular player-emitter association
SELECT b.*
FROM emitters_has_players a
JOIN units b ON a.unit_id = b.unit_id
WHERE a.emitter_id = 1 AND a.player_id = 1
-- Get the defense points of a particular player-emitter association
SELECT SUM(b.averagedefense * a.quantity) AS total_def_pts
FROM emitters_has_players a
JOIN units b ON a.unit_id = b.unit_id
WHERE a.emitter_id = 1 AND a.player_id = 1
-- Create a new player-emitter-unit association
INSERT INTO emitters_has_players
VALUES (1,1,1,1) -- Where the fourth "1" is the quantity of units initially.
-- Player adds on one more of a particular unit for a particular emitter
UPDATE emitters_has_players
SET qty = qty + 1
WHERE emitter_id = 1 AND
player_id = 1 AND
unit_id = 1