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 ?
        */
    }
}

ユーザーは複数の場所でゲームをプレイします。 編集:そして、ユーザーが座席でプレイする場所ごとに。または別の席で... ゲームがプレイされた場所を知りたいときは、Game.location にアクセスします。誰がプレイしたか知りたいときは、Game.location.user にアクセスします。

ここに私の問題があります: Game.location を User.locations の 1 つへの同じ参照にしたいのですが、これを行う方法がわかりません...そして、グローバルに、コードに何か問題があると感じています...

助けはありますか?ありがとう

4

1 に答える 1

1

テーブルにがあるので、場所が実際に何であるかを説明するテーブルがあると思いplaceIdますが、テーブルは単にユーザーと場所の間の多対多のマッピングを表しています。LocationPlaceLocation

その場合、独自のLocationを持つ必要はなく、クラスである必要はありませんが、必要です。IdPlace

データベースから各オブジェクトのインスタンスを 1 つだけロードするには、インスタンスを各クラス内の静的マップにキャッシュします。

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);
    }
}

これは以下を使用します。

于 2011-02-07T16:56:51.117 に答える