문제

금융 거래 상태를 저장하려면 테이블이 필요합니다. 이 거래의 상태는이 클래스에 의해 대략 모델링 될 수 있습니다.

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
)

또한 10 진수 (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