2016-09-23 5 views
1

먼저 내 질문에 매우 정확 해 보자.자동 MySQL 테이블 생성

기본적으로 나는 PHP와 MySQL을 배우므로 약간의 프로젝트를 진행하고있다. 나는 나와 우리가 서로 빚진 돈을 추적 할 수있는 웹 사이트를 만들고 있습니다. 특히 몇 달에 걸쳐 조금씩 반환해야 할 큰 액수입니다. 그래서 우리 중 누구라도이 레코드에 이름을 부여하는 '레코드'를 시작할 수 있습니다. 'Car Expenses'를 선택하면 차용자가 큰 돈을 돌려받을 때마다이 기록에 거래를 추가 할 수 있습니다. 이 '자동차 경비'레코드에는 트랜잭션 ID, 반환 된 금액 및 날짜 등 (분명히이 비트로 돌아옵니다) 일부 열이 포함됩니다.

나는 확실히 두 테이블이 필요하다는 것을 알고있다 : 1) 사용자 - 사용자 이름과 이메일 주소가 우리 모두를 위해 저장되는 곳. 2) 기록 - 모든 기록에 대한 요약 정보 (기록과 관련된 거래 내역이 아닌)가 저장됩니다. 레코드 - 제목, 레코드 - 설명, 생성 시간, 마지막 업데이트 시간, 관련된 당사자의 이름 등등.

그러나 문제는 시스템의 세 번째 부분이 어떻게 작동 할 것인가에 대한 확신이 없다는 것입니다. 레코드에 대한 모든 거래를 보여주는 특정 레코드에 대한 세부 정보로 이동하십시오. 얼마나 많은 돈을 벌써 지불했는지 등등.

나는 사용자가 만든 각각의 개별 레코드에 대해 새 테이블을 만들려고했다. 이 테이블에서 트랜잭션 ID, 트랜잭션 날짜, 입/출력, 주석 및 모든 트랜잭션 편집/삭제 컨트롤이 준비됩니다.

필자가보기에, 매번 새로운 테이블을 생성하는이 접근법의 문제점은 새로 생성 된 각 테이블에 사용자 정의 된 이름을 부여하는 것은 도전 과제가 될뿐만 아니라 확장 된 각 테이블에 대해 새로운 테이블을 디자인하는 자동 쿼리를 실행하는 것입니다 기록은 매우 어려울 수 있습니다.

이 세 번째 부분을 구현하기위한 최선의 방법이나 내 웹 사이트의 전반적인 데이터베이스 디자인에 대한 더 나은 아이디어를 알려주십시오. 미리 감사드립니다.

+0

각 레코드에 대해 새 테이블이 필요하지 않지만 사용자 ID 및 레코드 ID를 참조하는 모든 레코드에 대해 하나의 테이블이 필요합니다. – aynber

+0

감사합니다 aynber, 나는 그것이 같은 테이블 내에서 하나의 레코드에서 트랜잭션을 선택하고 모든 사람들로부터 많은 트랜잭션이 어디 있는지를 보여주는 것이 복잡 할 것이라고 생각했습니다 – Ros

+0

user_ids와 record_ids 및 올바른 인덱스로 테이블을 올바르게 디자인한다면 , 추적하기가 어렵지 않습니다. 실제로, 각 레코드에 대한 링크가있는 전체 트랜잭션을 표시하려는 경우이 방법이 더 쉽습니다. – aynber

답변

0

일반적으로 데이터베이스에 너무 많은 테이블을 갖고 싶지는 않지만 사용자 정의 테이블을 너무 많이 갖고 싶지는 않습니다. 뿐만 아니라 공간을 차지할 것입니다,하지만 그것에서 쿼리하는 것은 불가능한 옆에있을 것입니다.

대신 수행해야하는 작업은 나열된 열과 관련된 모든 트랜잭션에 대해 별도의 테이블을 만드는 것이지만 트랜잭션이 속한 사용자의 ID를 보유하는 추가 열을 만드는 것입니다. 이를 통해 JOIN 명령을 통해 쉽게 쿼리 할 수 ​​있습니다.

+0

감사합니다 Hex37, 내가 미래에 점점 더 많은 사용자 (알고있는 친구 및 친구)가 있다면 그 하나의 테이블이이 모든 거래를 통해 한계에 도달 할 수 있다고 생각했습니다. – Ros

+0

SQL에 대해서는 거의 걱정할 필요가 없습니다. 이 스크립팅 언어로 표를 검색하는 것은 매우 효율적입니다. 코딩 언어의 요점입니다. 대부분 수십만 개의 테이블이있는 테이블의 경우 가장 오래된 항목에 대해 별도의 아카이브 테이블을 작성해야합니다. – Hex37

+0

너무 정교 해 주셔서 감사합니다. 그렇다면 테이블이 제한에 도달하여 아카이브 테이블에서 분할되어야 할 때를 어떻게 알 수 있습니까? 여전히 아카이브 테이블에서 같은 방식으로 쿼리 할 수 ​​있습니까? – Ros

0

사용자 및 교환 시스템의 모든 다른 요소를 나타내려면 간단하고 일관성있는 스키마를 만들어야합니다. 일반적으로 "거래"와 같이 예약 된 키워드를 사용하지 않으려면 이름을 선택하는 것이 까다로울 수 있습니다.

돈을 교환 할 때마다 새로운 테이블을 만드는 것은 완전히 잘못되었습니다. 관계형 데이터베이스의 요점은 동일한 테이블에 여러 레코드가 저장되어 다른 레코드와 단순한 관계가있는 것입니다. 예를 들어, 교환기는 발신자와 수신자를 각각의 "사용자"레코드 식별자로 참조합니다. 간단한 측면에서

는 :

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, 
    name VARCHAR(255), 
    created_at DATETIME 
); 

CREATE TABLE exchanges (
    id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, 
    amount NUMERIC(12,2) NOT NULL, 
    sender_user_id INT, 
    recipient_user_id INT, 
    created_at DATETIME 
); 

이것은 매우 간단한 방법이다. 보다 견고한 솔루션은 ledger structure을 사용합니다. 여기서 교환은 계정간에 두 개의 관련 있지만 독립적 인 전송으로 나뉩니다.

는 이제 균형을 빚 알고 싶다면 : 그들이 빚을 얼마나 많은 돈을받는 사람 별 기준을 보여줍니다

SELECT sender_user_id, SUM(amount) FROM exchanges 
    WHERE recipient_user_id=? 
    GROUP BY sender_user_id 

. 오랫동안 "지불 한 금액"을 부정적으로 나타내는 한 그 값은 0이됩니다. 원장이이 일을 더 잘합니다.

+0

정말 자세한 답변을 주셔서 감사합니다. LOL과 같이 15-20 분 정도면 완료 할 수 있습니다. 이미 수 주일을 보냈습니다. 세 번째 '레코드'(요약) 테이블을 추가하려는 이유는 사용자의 대시 보드에서 내가 소장하고있는 모든 레코드 (작은 카드 일 수 있음)를 표시하기 때문입니다. – Ros

+0

개발자로서 경력을 쌓으려면 여러 번 같은 원장 시스템을 만들라는 질문을 받게됩니다. 열 번째 때까지 그것은 일상적이됩니다. 처음에는 꽤 어지럽게 복잡합니다. 요약 레코드는 종종 동기화되지 않으며 소량의 데이터에 대해서는 신뢰할 수없는 요약 레코드보다 빠른 'SUM()'이 더 좋습니다. – tadman

+0

좋은 하나! 장부 시스템을 확실히 조사 할 것입니다. 시간과 부끄러움에 대해 다시 한 번 감사드립니다. 초보자 인 경우 게시물에 대해 엄지 손가락을 올릴 수는 없습니다. – Ros

관련 문제