استمرار المال في قاعدة البيانات.تصميم المقرر

StackOverflow https://stackoverflow.com/questions/427362

  •  06-07-2019
  •  | 
  •  

سؤال

أريد جدول لتخزين الدولة من المعاملات المالية.الدولة من هذه الصفقة يمكن أن يكون تقريبا على غرار من قبل هذه الفئة.

class FinancialTransaction
{
    Integer txId,
    Money oldLimit,
    Money newLimit,
    Money oldBalance,
    Money newBalance,
    Date txDate
}
class Money
{   
    Currency curr,
    BigDecimal amount
}

أول تصميم المخطط يبدو مثل هذا:

CREATE TABLE tx
(
    txId bigint(20) unsigned NOT NULL,
    oldlimit_currency varchar(3) NULL,
    oldlimit_amount decimal(7,5) default 0.00,
    newlimit_currency varchar(3) NULL,
    newlimit_amount decimal(7,5) default 0.00,
    ----snipped----
    PRIMARY KEY (txId)
)

اثنين من الأشياء التي تقلق لي:

  1. كل عملية تحدث على أساس عملة واحدة.لم أفكر بعيدا بما فيه الكفاية إذا كنت قد تحتاج إلى دعم المعاملات التي قد تحدث في بعملات متعددة.على افتراض أنه لا تغيير ؛ ثم أليس أكثر فعالة من حيث المساحة فقط الحفاظ على عملة واحدة عمود ؟ سوف تندم على هذا التبسيط الحل ؟
  2. لأن كل المال البند قيمة الكائن ، وينبغي بدلا من ذلك حفظ جميع المال الكائنات في المال منفصل الجدول الأصلي استخدام الجدول moneyIds الخارجية مفاتيح المال الطاولة ؟

وهذا هو ،

CREATE TABLE tx
(
    txId bigint(20) unsigned NOT NULL,
    oldlimit_money_id int NOT NULL,
    newlimit_money_id int NOT NULL,
    ----snipped----
    PRIMARY KEY (txId),
    FOREIGN KEY (oldlimit_money_id) REFERENCES MONEY(id) ON DELETE NO ACTION ON UPDATE NO ACTION,
    FOREIGN KEY (newlimit_money_id) REFERENCES MONEY(id) ON DELETE NO ACTION ON UPDATE NO ACTION
)

هل هناك بديل التصاميم ؟

شكرا lazyweb.

هل كانت مفيدة؟

المحلول

العملة قيمة المال مفهومان مختلفان لذا سيكون من الأفضل أن تفصل بينهما.ليس هناك حاجة لجعل جدول منفصل عن "القيم" ولكن سيكون من الأفضل أن يكون لديك واحد على العملات لأن هذه هي كيانات منفصلة.التصميم الجديد من شأنه أن تبدو وكأنها:

CREATE TABLE tx
(
    id bigint(20) unsigned primary key,
    old_limit_currency_id int not null references CURRENCY(id),
    old_limit_value decimal(7,5) not null,
    new_limit_currency_id int not null references CURRENCY(id),
    new_limit_value decimal(7,5) not null
)

أيضا, تحقق مما إذا عشري(7,5) لديه ما يكفي من الفضاء الخاص بك سيناريوهات تبدو منخفضة قليلا.هناك مثل قديم يقول:"أفضل آمنة من آسف" :)

نصائح أخرى

  1. إذا كان في المستقبل تحتاج إلى دعم المعاملات بين عملتين ، فإنه ينبغي أن يكون من الممكن أن نموذج هذا صفقتين مع واحد من كل عملة من العملات.
  2. يبدو أن المال الكائنات, لغويا, القيم بدلا من الكيانات.وبالتالي أنا لا أرى ضرورة فصل من الكيانات.

ماذا عن الفكرة الثالثة:

CREATE TABLE tx
(
  txId bigint(20) unsigned NOT NULL,
  currency varchar(3) NOT NULL,
  oldlimit decimal(7,5) default 0.00,
  newlimit decimal(7,5) default 0.00,
  ----snipped----
  PRIMARY KEY (txId)
)

جميع المال قيم معاملة واحدة تحتاج إلى أن تكون من نفس العملة ، أليس كذلك ؟

لو انها ليست مبالغة, يذهب خطوة أبعد وتخزين جميع المبالغ/القيم في عملة واحدة و الحفاظ على أسعار الصرف الجدول.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top