2011-02-07 52 views
0

我有點很多關於在OO/DB關係該怎麼辦...單參考爲多個對象

這裏是DB模式:

CREATE TABLE User 
    Id 

CREATE TABLE Location 
    userId 
    // EDIT oups, wrong ! 
    // placeId 
    // Should be : 
    seatId 

CREATE TABLE Game 
    locationId 

現在一些代碼:

class User 
{ 
    private Location locations[]; // need this for several reasons... 

    public function loadFromDatabase() 
    { 
     // Load data from DB 
     // ... 
     result = DB::query("SELECT Id FROM Locations WHERE userId="+this->Id); 
     foreach(result) 
     { 
      l = new Location(); 
      l->loadFromDatabase(result); 
      locations[] = l; 
     } 
    }  
} 

class Location 
{ 
    private User user; 
    public function loadFromDatabase() 
    { 
     ... 
    } 
} 

class Game 
{ 
    private Location location; 
    public loadFromDatabase() 
    { 
     /* 
     Here comes the problem : 
     how to have a reference to a location 
     created by the User class ? 
     */ 
    } 
} 

A用戶玩遊戲,在幾個地點。 編輯:併爲每個位置用戶在座位上播放。或在另一個座位上... 當我想知道遊戲在哪裏玩過時,我訪問Game.location。當我想知道是誰玩的時候,我訪問Game.location.user

這是我的問題:我想讓Game.location與User.locations中的一個相同,並且我不知道要做到這一點...... 而且,全球範圍內,我覺得有什麼錯我的代碼...

任何幫助嗎? 感謝

回答

1

既然你已經在你的LocationplaceId,我認爲有一個Place表,介紹了這些地方實際上是,而Location表僅僅代表用戶與地方之間的許多一對多的映射。

在這種情況下,Location自己不需要有Id,不需要是類,但是Place可以。

爲了從數據庫中加載只是每個對象的一個​​實例,在每類中的靜態地圖緩存實例。

class Place 
{ 
    // Static 
    private static Place loadedPlaces[]; 

    public static function get(id) 
    { 
     if (!loadedPlaces[id]) 
     { 
      loadedPlaces[id] = new Place(id); 
      loadedPlaces[id]->loadFromDatabase(); 
     } 
     return loadedPlaces[id]; 
    } 

    // Non-static 
    private id; 

    public function loadFromDatabase() 
    { 
     // ... 
    } 
} 

然後拿到引用爲用戶或遊戲的性能的地方,你只要通過靜態方法訪問它們。

class User 
{ 
    public function loadFromDatabase() 
    { 
     result = DB::query("SELECT placeId FROM Locations WHERE userId="+this->Id); 
     foreach(result) 
     { 
      places[] = Place::get(result); 
     } 
    }  
} 

class Game 
{ 
    public function loadFromDatabase() 
    { 
     place = Place::get(place); 
    } 
} 

它使用:

+1

謝謝您的回答。你給了我我需要的東西。我沒有提供一些細節,也沒有正確寫出我的類名。而不是placeId,你應該閱讀seatId。用戶可以在一個預定座位上的位置上玩遊戲,並在另一個預留座位上的相同位置玩。但是,你對靜態地圖的解釋正是我所需要的:這樣我就可以保存獨特的實例。順便說一句,按照這種方式是否有任何設計模式? – Antoine 2011-02-07 17:36:15