2009-06-26 5 views
0

私たちはすべて、dbがストレージ用であり、コードがそれと密接に結合してはならないことに同意します。 dbにプリファレンスを格納するとき、これをどのように達成しますか?例を挙げましょう。チャレンジ - コードとDBの行を分離したままにする

少しのオンラインポーリングを作成しているとします。各投票は「投票タイプ」を持つことができます。

  • 匿名投票
  • IPベースの議決
  • など

今、ユーザーがアンケートを作成し、「投票の種類」を記憶インターフェースがある場合:ここではいくつかの投票の種類がありますある時点で、db(プライマリキーまたは名前のいずれか)に「匿名投票」や「IPベースの投票」などのコードを関連付けることは避けられないようです。

d question、John Sandersはこれが馬鹿だと言った - そして私は彼に完全に同意する!なぜdbとコードを接続するのですか?それは悪い考えです。しかし、あなたが「投票タイプ」のようなものを保管しているなら、どのようにそれを避けるのですか?

答えて

1

列挙型であるかどうかにかかわらず、言語がサポートしている定数を定義するだけです。

enum VoteType { Anon = 1, IP = 2, ... } 

がで一定の値を持つ、データベース内のポール・テーブルの投票型の列を持っている。あなたは、データベースに参照整合性を強制したい場合は、関連する値をルックアップテーブルを作成し、それ以外の場合はない、でこの場合、これらはデータベースに対する不透明なデータです。

ここでは、たとえば、タイトルの列を持つPollテーブルよりも結合はありません。それはあなたが保存する必要がある投票の側面ですので、保存してください。

+0

このバグは私には...しかし、あなたが私に尋ねると、これは得られるほど良くなります。私はより良い答えを聞いてみたいと思っています。 – Beska

+0

これは私のすべてのコードにも散在しています。問題は、コードを別の機関と共有していることです。彼らがアプリをインストールしたとき、私たちのテーブルのいくつかは同じIDで終わらなかった。私は以下のエントリでこの問題を最小化する方法を提案しました – Daniel

0

私が間違っている場合は正解しますが、Polls tableにはvote_type fieldを保存できませんか? vote_typeがipの場合、storeVoteByIP()関数を使用します。 userIDの場合は、storeVoteByID()メソッドを使用するか、スイッチを使用する方法を使用します。

はおそらく、私は素朴なんだけど、私はここでの課題が表示されていない:)

switch($vote_type) { 
    case 1: 
    #insert_vote_by_ip(); 
    break; 
    case 2: 
    #insert_vote_by_userid(); 
    break; 
    ... 
} 

私は何をしないのですか?

+1

実際にこれを行う方法はいくつかあります。この特定の解決法は、id 'vote_type'と任意のコードで実行するコードとの間の接続を埋めているという事実に苦しんでいます。私が試みた1つの方法は、 "ip"が接続されているという事実を登録したクラスを持って、それを知っているマネージャーに自身を登録することです。これの批判のために: 私はそれらのうちの3つをhttp://stackoverflow.com/questions/1050062/suggested-architecture-for-associating-code-to-db-rowsに挙げました。 – Daniel

-2

1つのことは、XMLとしてデータベースのXML列にプリファレンスを格納することです。データベースは保存されるものを気にしません - それを把握するのはコードまでです。

+0

今、この問題は何ですか?私は非常に成功する前にこれをやって、データベース列にプリファレンスをシリアル化しています。また、ディスク上のファイルではなく、データベースから構成設定を取得する構成ソースプロバイダを使用しました。 downvotersはおそらくこの答えの何が間違っているかについての手がかりを与えることができますか? –

0

コードのデータ構造とデータベースの構造との間に何らかの接続が必要です。アプリケーションコードとデータコードを混在させないためにこれを回避しようとするのは価値がありません。コードとデータの両方を最も一般的な方法で設計する必要があります。これはいくつかのアプリケーション(データ構造を設計できるアプリケーションを設計する)では必要かもしれませんが、他の多くの人には望ましくない可能性があります。実際に投票テーブルがどのように構造化されているかを知るためにデータベースにクエリしますか?各列の数はいくつですか?列の名前は何ですか?

きれいで整然としたアプリケーションを維持する良い方法は、テーブルとアプリケーションコードの両方が値を取得するコンポーネントを維持することです。

したがって、いくつかの静的な最終フィールドを持つVoteTypesクラスを設計することができます。実際にデータベースに入る値の名前にアクセスするには、あなたのコードは

getAnonVotingTypeName() getIpBasedVotingTypeName() など。

名が変わった場合は、この方法で、あなただけに必要となる呼ぶだろうその1つのクラスでそれらを変更します(もちろんテーブルの既存のレコードを更新します)。

0

あなたは列挙型を持つことができます。C#では、何かのように:あなたは、単に言うコードで、その後

public enum VoteType 
{ 
    ANONYMOUS, 
    IP_BASED, 
    OTHER 
} 

と、

switch(vote.Category) 
{ 
    case VoteType.ANONYMOUS: //do stuff 
    case VoteType.IP_BASED: //do some other stuff 
    //etc 
} 

これは、ベースの文字列を使用するよりも優れているようなものは、それはそのようなmispellingとスタッフのいくつかのエラーを回避します。

0

コードとデータのデカップリングの主な理由は、ある時点でデータを別の方法で提示したいということです。その時点で、コードとデータが密接に結合されている場合は、それを取り除くために多くの作業を行う必要があります。

もう1つの理由は、データベースではなくテキストファイルのコード変更を簡単に行うことが難しいということです。

プレゼンテーションが決して変更されないことがわかっていて、コードを最新の状態に保つ簡単な方法が分かっている場合、それらを分けておく大きな理由はありません。

ただし、このような場合は非常にまれです。

0

頻度や頻度が高い新しい投票タイプを作成する場合など、頻繁に変更すると、設定や設定を保存することをお勧めします。

反対に、新しい投票タイプがモデルにとって非常に重要な場合(たとえば、IPベースの投票で統計を取得するシステム全体やそれに関連する多くのビジネスロジックがある場合など)は、

しかし、データベースがソースコードに影響を与えている(特にトランザクションを扱うとき)という理由だけで、データベースをコードから完全に切り離すことはできないと思います。

0

のは、あなたが持っている可能性がありますので、実際にVoteTypeが何をすべき(それはis_another_vote_availableのようなものを確認することができます)何を考え出すのハードワークを行い、クラスなどを作成することとしましょう:

  • VoteTypeIpSingleVote:この1 IPアドレスごとに1つの投票を許可します
  • VoteTypeAnonymous:これは投票に制限がありません。あなたはVoteTypeテーブルのエントリを持っているでしょうDBに

  • 1つのIP議決
  • 2匿名

あなたは、インターフェイスのすべてのVoterTypes(VoteTypeAnonymous作ることができます等)のいずれかを返すプロパティ "VoteType"を持つ実装。

a)行tの主キーハッシュが に関連付けられているb)ハッシュが主キーである列挙型 c)設定テーブルでルックアップを実行することによって検出される主キー(これはデータベースとコードの間の接続が全員にアクセス可能であるという利点があります)

このアプローチの利点は、各VoterTypesが登録する(またはリフレクションを使用して自動的に登録することもできる)マネージャクラスを持つことができることです。

だから、あなたが呼び出すことができます。

ID = fetchVoteTypeToBeUsedFromDb

manager.getVoteType(ID).is_available(datetime.now())

そして新しいVoteTypesがシームレスでだけ追加することができ、そのようswitch文をcontinaullyに更新する必要はありません。

関連する問題