簡體   English   中英

數據庫設計-困惑

[英]Database Design - Confused

下面的圖片是我到目前為止所擁有的。

到目前為止我有什么

該設計

發射器表

發射器具有其自己的屬性,例如位置(以x和y表示),id,級別和上次更新此信息的屬性。 更重要的是,任何家族成員都可以捍衛發射者。 發射者只能由該氏族的成員來捍衛。 一個發射器可以由許多玩家捍衛。

玩家表

或者說,氏族成員。 該表專門包含有關播放器的信息。 這也具有關於x和y的位置以及有關該玩家的其他信息。 (我可能還會在這里添加lastupdated)一個玩家可以防御多個發射器。

Emitter_Player連接表

該表包含單個發射器_播放器組合。 (假設存在這樣一種關系)首先讓我問一下,這是否是發行方和參與者之間的適當關系? 我認為這將是多對多的。 現在,我可以輕松解決這個問題,只需將防御點添加到此聯接表中(我真正關心的是,玩家在特定發射器中具有多少“防御”),這也是正確的做法嗎? 但是,我想“在第一時間做到正確”,並添加有關玩家保護該發射器的每個特定單元的信息。

單位表

下表包含有關游戲中所有單位的信息。 該表具有單位ID及其相關的防御性和攻擊性值。 這張桌子很少會插入,當它插入時(新單位被添加到游戲中),它將被手動更新。

問題

修改設計

發射器不包含玩家以外的單位。 玩家必須是發射器中每個單元的所有者。 因此,發射器和單元之間沒有關系。 同樣,盡管玩家可能在發射器之外有單位,但我不在乎這個示例。 我只關心發射器中的單位。 因此,我發現Emitter_Player連接表和Units表之間將存在多對多關系。 我這樣做的理由是,Emitter_Player組合可以輕松擁有許多不同類型的單元,而一種類型的單元可以具有許多不同的Emitter_Player組合。

插入信息

現在有了兩個連接表,我對如何向數據庫中插入信息感到非常困惑。

查詢信息

同樣,我極度迷失了如何從該數據庫訪問信息。

目標

圖表

我最終希望創建一個圖表(來自玩家和發射器),以顯示其隨着時間的推移。 我不知道該如何查詢。

每周變更

我想通知玩家他們是上周以來取得了進步還是失去了進步。 (在這種情況下,請對其進行標記以供審核)

結論

我嘗試將其盡可能詳細,如果您需要更多信息,請告訴我。 我希望很快完成此工作,而我真的完全失去了任何想法。

您的起步相當不錯,但是我建議一些建議:

在我看來,您可以將emitters_has_players_has_units表合並到emitters_has_players表中。 簡單地使unit_id中的主鍵的第三組分emitters_has_players

在此處輸入圖片說明

您還會注意到,我在特定的emitter-player-unit關聯中添加了quantity列。 這對於跟蹤特定玩家對特定發射器具有多少個特定單元很有必要。

保持您的列名在整個數據庫中保持一致也是一種很好的做法。 最初為您的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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