2012-03-20 28 views
2

我有一個幻想足球比賽的數據庫。 有三種模式:數據庫設計建議(具體示例 - 幻想足球)

  • AFL(與澳大利亞橄欖球聯盟實體)
  • DDHP(與當地的幻想競爭實體)和
  • DBO(對於沒有具體要麼擁有的實體)。實體

    • 每個玩家扮演一個AFL隊(有沒有需要通過時間來跟蹤這一點,所以如果玩家我只是記錄了目前球隊的球員效力於,並更新此的

    說明改變俱樂部)。

  • 一些球員參加ddhp球隊比賽。這是由具有FromRound和ToRound的合同表示的,表示合同有效的時間界限。
  • 有回合。 afl和ddhp之間基本上沒有區別,所以只有一張桌子。
  • 有固定裝置,代表兩個ddhp球隊在一回閤中互相對抗。
  • 當玩家在一輪中玩,他們記錄統計。
  • 每輪,每個ddhp團隊從他們的簽約球員中選擇那些將爲他們效力的球員。這由RoundPlayers表示。

問題是RoundPlayers和Stats之間存在一定程度的尷尬。從邏輯上講,RoundPlayer在統計中有一排代表他們在該回閤中的出場(如果他們出場)。這是一對一的關係,但兩個表都是可選的。玩家可能不會在一輪中玩,因此沒有統計。玩家可能也不會被選爲RoundPlayer,因此該表中沒有行。一個由Round和PlayerId鍵入,另一個由Round和ContractId鍵入。從一個導航到另一個有點尷尬,特別是當試圖使用ORM(例如實體框架4),因爲導航屬性基於外鍵,而這種關係通過中間表(合約)來獲得PlayerId。

我想過把ContractId添加到Stats(如果玩家被選中去玩那個回合)但是覺得不對。我也考慮過去除Stat和Roundplayer之間的1對1關係,並將它們移動到一張桌子上,但這也是錯誤的。

我很感激任何關於如何獲得RoundPlayer和Stat之間更好的關係的想法,甚至可能完全改變這種結構的任何想法。

enter image description here

回答

0

我看到這張貼一年前,你有沒有答案。希望你現在已經知道了一些東西,並且每天都不會徒勞地檢查Stackoverflow,看看是否有人會提供幫助。但出於一般性討論的目的,這裏是我的答案:

這個缺陷,在我看來,我認爲你看到的是同樣的事情,就是你有兩個表的記錄直接相互關聯,他們有完全不同的鑰匙。

據我瞭解你的描述,如果有一個RoundPlayers記錄,總會有一個匹配的Stats記錄,反之亦然。在這種情況下,我認爲教科書的答案是:

(a)將兩者合併爲單個記錄。他們總是一起走,爲什麼不讓他們成爲一個記錄?我認爲不這樣做的主要原因是RoundPlayer在統計方面在不同的環境中很有趣。也就是說,當我們安排時,RoundPlayer很有趣,但Stats對於玩家表現的長期積累很有意思。或者(b)將統計中的外鍵丟給團隊,玩家和回合。取而代之的是給RoundPlayer一個外鍵,或者複製到合同和回合的鏈接。這將使你的鍵一致。

團隊的鏈接似乎對我特別可疑。你能通過播放器找到團隊嗎?如果玩家切換到另一個團隊,統計團隊是否應更新爲匹配?如果是這樣,這是多餘的,並可能導致兩者不同步。或者,統計數據是否與原始團隊保持聯繫?但是球隊有什麼不同呢,因爲這是AFL球隊而不是DDHP球隊?也許我誤解了一個要求。我對澳大利亞足球一無所知。 (這一定是一場非常艱難的比賽,因爲球員們必須在世界末日倒掛的同時進行比賽......)

+0

感謝周杰倫,我很樂意發表評論,甚至很晚。儘管通過其他方法減輕了這個問題,但問題仍然存在。 (a)在Stats之前,RoundPlayers不存在。它們是在不同的時間創建的。並非所有的Stats都有一個RoundPlayer。 (b)不起作用,因爲並非所有Stats都有RoundPlayer。當我說有一對一的關係時,我發現我的問題並不清楚,稍後再編輯:) – Simon 2013-05-03 14:45:08