ユーザーの請求情報のテーブルでは、請求される頻度を示すフィールドが必要です。現在、唯一のオプションは毎月または毎年です。ベストプラクティス:mysqlフィールドを配置する場所
この場合、どのようなベストプラクティスですか?サブスクリプションテーブルのフィールドに実際の値を保持するか、サブスクリプション頻度テーブルを作成し、毎年1回、毎月2回、サブスクリプションテーブルにIDを挿入しますか?
ユーザーの請求情報のテーブルでは、請求される頻度を示すフィールドが必要です。現在、唯一のオプションは毎月または毎年です。ベストプラクティス:mysqlフィールドを配置する場所
この場合、どのようなベストプラクティスですか?サブスクリプションテーブルのフィールドに実際の値を保持するか、サブスクリプション頻度テーブルを作成し、毎年1回、毎月2回、サブスクリプションテーブルにIDを挿入しますか?
は、与えられたように、他の情報と...
私の個人的な好みはちょうどエンティティテーブルに「サブスクリプション周波数」属性を保存することです。
別個のテーブルを作成する必要はありません。 (私は "購読頻度"がシステム内の実体であるとは見ません。私は実際にそれが必要なものについて、参照整合性と外部キーを持つ複雑さがすでに十分にあります)。
私のテーブルに対して、 "lookup"テーブルへのジョインを要求して、idから文字列値を返すようにします。それは不必要なようです。
個人的に、私はこのような列を追加することを検討したい:
subscription_frequency ENUM('','monthly','annually')
私はリストに別の値を追加する必要がある場合:ここ
ALTER TABLE mytable
MODIFY subscription_frequency ENUM('','monthly','annually','quarterly')
ENUM例は1バイトだけを必要としますのストレージ。 ENUM
のINSERT/UPDATE/SELECTステートメントは、VARCHARのように機能し、列挙型リストに含まれていない文字列値のINSERT/UPDATEを伴う不快感を伴います。
ENUMを避ける理由があれば、私はVARCHARを保存するだけです。
追加のルックアップテーブルが必要な場合は、私はサロゲートIDをプライマリキーとして使用しません。私は文字列の値を 'monthly'、 'primary'、 'foreign key'カラムとして使用します。 (私はid
から文字列を返すためにJOINを必要としないようにしたいと思います)。リストに値の順序がある場合は、順序列を追加して順序付けします。
* "idから文字列を返すためにJOINを必要としないようにしたい" *なぜですか? –
@ᵈˑᵈˑ:良い質問です。特別な結合により、SQL文はより複雑になります。もっと簡単なステートメントは、他のエンティティテーブル( "subscription"、 "subscriber_account"、 "subscription_address"など)へのジョインを追跡することをすでに手掛けている将来の読者にとっての利点です。そして、サロゲート 'id 'を外部キーとして使用すると、INSERTまたはUPDATEを実行するときに、' id'値を参照するために余分なSELECTが必要になります。複雑さのコストに導かれた利点を評価し、追加の複雑さが費用効果がないと評価します。 – spencer7593
ああ、良い正当化。ありがとう! –
これは、環境設定と拡張機能になります。私は個人的にSubscriptionFrequency
という属性(id,description,billingFrequency,createDate,lastModifiedBy,etc...
など)という名前の別のテーブルを作成します。 UserBillingSubscriptionInfoに格納する値は、この新しいテーブルの主キーへの外部キーです。他のオプション(単純に1 =年と2 =月を暗示する)を行うなら、その関係がどのように働くかをスキーマや文書に記述します。
あなたは私が思っていたものを正確に映します。それは非常に重要な決定ではありませんが、スケーラビリティの場合、私は別の "SubscriptionFrequency"テーブルを持つことをお勧めします。 –
私は概念を理解しています。ただし、これらの値が明確に定義されていない場合は、データベースにアクセスする他の開発者または関係者を混乱させる可能性があります。さらに、新しいオプションを追加するのが簡単になり、SubscriptionFrequencyオプションを使用してユーザーインターフェイスを作成したい場合は、アプリケーションでハードコーディングするのではなく、データベースからの直接的な記述を簡単に動的に制御できます。可能性は無限ですが、結局それはあなたまたはあなたの開発チーム次第です。 –
請求頻度は、サブスクリプションの属性に過ぎません。サブスクリプションごとに1つの属性しかありません。だから私の意見では、余分なテーブルと結合の必要はありません。
もちろん、請求頻度のある余分なテーブルを追加することもできます。 1: annually
のように、2: monthly
,3: weekly
などです。また、サブスクリプションテーブルの請求頻度フィールドに値としてid
を使用します。
また、そのフィールドに年間課金プロセスの量を保存し、アプリケーションで「命名」を行うことができます。 (1 =毎年、12 =毎月、52 =週1回など)。仕様では
IMHO、フィールドに値を入力してください。余分なルックアップテーブルは必要ありません。その値は変わらないからです。 –
頻度の種類を保持する2番目のテーブルを作成し、それをサブスクリプションテーブルにリンクすることをお勧めします。これは、IDを人間が読める名前で翻訳するエレガントな方法を提供し、将来的に他の頻度を簡単に追加できるようにします。 –
しかし、そのフィールドの値に関する詳細が変わるとどうなりますか?たとえば、毎月のように毎月の請求日を設定する場合はどうすればよいですか?それから、第1は本当に第7になる必要があることを認識していますか? –