2012-05-01 49 views
5

これは完全に仮説的な質問です。ユーザーのメンバーシップを保存するデータベースがあり、特定の期間(1ヶ月、3ヶ月、6ヶ月、1年など)持続できるとします。データベースでは、期間を開始日または終了日、または開始日と期間として保存する方が良いですか?

は、それがより良いフィールドを有するMembershipsが(各日付は、UNIXタイムスタンプとして記憶されている)テーブルを有することである:

user_id INTstart_date INTend_date INT

やとして格納する。

user_id INTstart_date INTlength INT

どちらの方法でも、アクティブなメンバーを持つユーザーを照会できますヒップ(例えば)。後者の状況では、クエリが実行されるたびに算術演算を実行する必要がありますが、前者の場合は終了日を1回だけ計算する必要があります(挿入時)。この観点からは、前者のデザインはより良いようですが、それには何らかの欠点がありますか?その代わりに長さを保存することによって避けることができる共通の問題はありますか?それは日付を保存することで回避できません。

また、時刻/日付データを格納するときのUNIXのタイムスタンプや、DATETIMEが優先されますか?私は両方のデータ型(過度の変換)で問題に遭遇しましたが、通常はUNIXのタイムスタンプで解決します。 DATETIMEのようなものが好まれる場合、これは私の以前のデザインの質問に対する答えをどのように変えますか?

+0

この質問に対する回答はシステムによって異なりますか?どちらの解決策も私には良いようですが、あなたの質問のどれもが期間を気にかけなければ、最初のケースが良いです。そうでなければ、それは逆の方法かもしれません。また、長さを使用する重い照会と終了日を使用する重い照会がある場合は、両方の値をデータベースに保管することもできます。 –

答えて

2

これは、あなたの日付に対してどのような種類のクエリを実行するかによって異なります。クエリに開始/終了時間または日付の範囲で検索が含まれている場合は、開始日と日付が最初のオプションになります。

平均的なメンバーシップ期間は何ですか?1年以上何人のメンバーですか?)次に2番目のオプションを選択しました。

過度の変換について - どの言語でプログラミングしていますか? Java/RubyはJoda Timeを使用し、日付/時刻関連のロジックを大幅に簡素化します。

+0

+1統計上の良いキャッチ;) –

+0

私はこの回答とBrankoの組み合わせが最高だと思うが、私は1つだけを受け入れることができる...あなたの担当者が低いので、私はあなたにそれを与えます。 –

+0

よろしくお願いします:-) lol –

0

デザインの観点からは、開始日とメンバーシップの長さを持つ方が良いデザインだとわかります。

終了日は、メンバーシップの開始日と期間の派生品です。これが私の考え方です。

1

私は同意しません。私は開始日と終了日を持つことになります。毎回計算を実行することはありません。

1

2つの戦略は機能的に同等です。お気に入りを選んでください。

2

インデックスの場合は、データのクエリ方法によって決まりますかどうかによって異なります。

DBMSが計算された列の関数ベースのインデックスまたはインデックスをサポートしていない場合、唯一の手段は物理的にend_dateであるため、インデックスに直接割り当てることができます。

それ以外は、私は違いはあまりありません。

ところで、intではなく、DBMSが提供するネイティブの日付タイプを使用してください。まず、型の安全性を測る(日付が予想される場所でintを読み書きしようとするとエラーが発生する)、一致しない参照整合性を作ることができないようにします(ただし、日付に関するFKはまれです) (DBMSによって異なります)、DBMSは通常、日付コンポーネントなどを抽出するための関数を提供します。

+0

+1、良い指数をつかむ。 –

0

会員は、私は、このオプションをお勧めします時間をかけて切り替えている場合:

user_id INT, 
since_date DATE, 
active_membership BIT 

active_membership状態が時間をかけて切り替えているものである、とsince_dateはこれが起こったときの追跡されています。あなたが許可され、会員の長さの有限集合を持っており、長さ、特定のユーザーが選んだのを追跡する必要がある場合はさらに、これはに拡張することができます。length_idが利用できるのルックアップテーブルを参照することになり

user_id INT, 
since_date DATE, 
active_membership BIT, 
length_id INT 

と許可しますメンバーシップの長さ。ただし、この場合、メンバーシップの長さを変更することが可能な場合は、since_dateがあいまいになりますのでご注意ください。二つの日付が非同期で変更されたときに正規化が故障していることを確認することは容易である

user_id INT, 
active_membership_since_date DATE, 
active_membership BIT, 
length_since_date DATE, 
length_id INT 

をこのアプローチでは:その場合はあなたも、これをさらに拡張する必要があります。これを正規化しておくには、実際に6NFが必要です。要件がこの方向に向いている場合は、Anchor modelingをご覧ください。

関連する問題