2010-06-23 4 views
0

저는 예약 시스템의 회계 부분을 담당하고 있습니다 (리무진 회사라고 생각하십시오).대결 테이블에서 NULL 사용

시스템에는 지불하거나 지불 할 수있는 여러 오브젝트가 있습니다. 필자는 tx, tx_cc 및 tx_ch라는 ​​세 테이블에서 이러한 모든 "트랜잭션"을 추적합니다.

tx는 트랜잭션 ID에 대한 새로운 tx_id를 생성하고 금액, 유효성 등에 대한 정보를 유지합니다. Tx_cc 및 tx_ch는 사용 된 신용 카드 또는 수표에 대한 정보를 각각 보관하며 다른 테이블 (credit_card 및 bank_account 다른 사람 사이에서).

이것은 상당히 정상적으로 처리 된 것 같습니다. 그렇습니까?

지불 트랜잭션이 이유의 무수를 위해 자리를 차지할 수 :

지금 여기 내 문제입니다. 예약이 지불되고 있거나, 예약이 지불되고있는 여행사, 운전사가 지불되는 경우 등

이 경우 엔티티별로 agent_tx, driver_tx, reservation_tx, 등

그들은 다음과 같이 :

CREATE TABLE IF NOT EXISTS `driver_tx` (
    `tx_id` int(10) unsigned zerofill NOT NULL, 
    `driver_id` int(11) NOT NULL, 
    `reservation_id` int(11) default NULL, 
    `reservation_item_id` int(11) default NULL, 
    PRIMARY KEY (`tx_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

지금이 거래는 드라이버이지만, 예약 또는 전체 전체 예약 개별 항목에 적용 할 수있다. 따라서 reservation_id 또는 reservation_item_id 중 하나를 null로 지정해야합니다. 미래에는 드라이버가 지불되는 다른 것들이있을 수 있습니다. 나는이 테이블에 추가 할 것이고, 기본값은 null입니다.

이 규칙은 무엇입니까? 의견?

분명히 나는 ​​이것을 세 개의 컬럼 테이블로 나눌 수 있지만, 필요한 외부 조닝의 양은 어수선해 보입니다.

귀하의 의견을 환영합니다.

평화, 톰

답변

1

은 어쩌면이 처리하는 가장 좋은 방법은 generalization 통해,하지만 주어진 데이터베이스 구조에 의해 이야기하기는 어렵다.
지불 할 수있는 모든 엔티티에 대해 4 퍼 유형을 모델링하고 지불 할 수있는 모든 엔티티에 대해 다른 4 퍼 유형을 모델링 할 수 있습니다.

CREATE TABLE IF NOT EXISTS `tx` (
    `tx_id` int(10) unsigned zerofill NOT NULL, 
    `paying_id` int(11) NOT NULL, 
    `payable_id` int(11) NOT NULL, 
    PRIMARY KEY (`tx_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
:

이 경우 테이블의 driver_tx이 일반화 될 것이다
관련 문제