2010-04-04 2 views
3

나는 파일과 사용자라는 몇 가지 테이블을 포함하는 데이터베이스를 가지고 있습니다. 이 관계는 many-to-many 다. 그래서 위의 두 테이블 모두에 외래 키를 가지고있는 users_files_ref라는 테이블도있다. 난다 - 대 - 다 관계를 어떻게 관리해야합니까?

> user_file_ref_id, USER_ID FILE_ID -> FILE_ID, FILE_NAME

사용자 - -> USER_ID, USER_NAME

users_files_ref

파일 : 여기

각 테이블의 스키마입니다 Codeigniter를 사용하여 파일 호스트 응용 프로그램을 만들었으며 사용자가 파일을 업로드 할 수있는 기능을 추가하는 중입니다. 이것은 내가 내 문제를 겪고있는 곳이다.

일단 파일을 파일 테이블에 추가하면 users_files_ref 테이블을 업데이트하기 위해 새 파일의 ID가 필요합니다. 지금은 파일 테이블에 레코드를 추가하고 마지막으로 추가 된 파일을 가져 오는 쿼리를 실행하여 ID를 가져온 다음 해당 ID를 사용하여 새 users_files_ref 레코드를 삽입한다고 생각했습니다.

나는 이것이 작은 규모로 작동한다는 것을 알고 있지만, 특히 교통량이 많은 시나리오에서 이러한 기록을 관리하는 더 나은 방법이 있다고 상상합니다.

내가 관계형 데이터베이스 물건에 새로운 오전하지만 잠시 동안 PHP 주변에 있었다, 그래서

나는 기본 및 외래 키를 사용하여 파일을 올바르게 설정 한

, 사용자 및 users_files_ref :-) 여기에 나와 함께 곰하시기 바랍니다 테이블,이 시나리오에 대한 파일 레코드 추가를 관리하는 방법에 대해 궁금한가요?

제공된 도움을 주셔서 감사합니다. 매우 감사드립니다.

웨스는

답변

1

방금 ​​삽입 한 행의 ID 번호를 얻으려면 $this->db->insert_id()을 사용하십시오. 추가 문서는 여기에 있습니다 : http://codeigniter.com/user_guide/database/helpers.html

+0

여름, 나는 CI 문서를 살펴볼 때이를 넘었지만 실제로 마지막 삽입물을 실제로 잡았다는 것을 알지 못했습니다.] 저장 프로 시저 학습이 필요하지 않으므로 완벽한 솔루션처럼 보입니다. 하지만 많은 사용자가 동시에 업로드 할 때 저장 프로 시저가 이러한 삽입의 무결성을 더 잘 관리 할 수 ​​있는지 궁금합니다. 이 특정 방법으로 문제가 생겼습니까? 이 작은 보석을 내 관심에 가져 주셔서 감사합니다! – wes

+0

나는 Ellis Labs의 사람들이 명백한 동시성 문제가있는 데이터베이스 방법을 폭로하기에는 너무 좋을 것이라고 확신한다. 또는 항상 자신을 안심시키기 위해 소스 코드를 볼 수 있습니다. 나는 결코 문제가 없었다. :) – Summer

0

나는 당신이 필요로하는 것은 바로이 생각 :

    ----primary key----- 
users_files_ref -> | user_id, file_id | 

당신은 어떻게하여 FILE_ID 당신이 구현하고있는 코드에 따라 달라집니다 얻을. 당신의 추론은 정확합니다. 이미 user_id가 있고 file_id를 가져와야합니다. 이 값을 사용하여 user_files_ref에 새 행을 추가 할 수 있습니다. 나는이 작업을 수행해야하는 경우

나는 보통 파일을 삽입하고 출력으로 순서 NEXTVAL를 반환하는 시퀀스의 도움으로 저장 프로 시저가 있습니다. 이것은 그러한 cenario를 구현하는 한 방법 일 수 있습니다.

CREATE OR REPLACE PROCEDURE SP_IMPORT_FILE(FILE IN FILE.FILE%TYPE, 
              FILE_ID OUT NUMBER) 

IS 

BEGIN 

    SELECT SEQ_FILE.NEXTVAL INTO FILE_ID from DUAL; 

    INSERT INTO FILE (FILE_ID, FILE) VALUES (FILE_ID, FILE); 

END SP_IMPORT_FILE; 
+0

대단히 감사합니다! 내가 만든 것처럼 각 사용자에 대한 기본 폴더 레코드를 만들기 위해 저장 프로 시저를 사용할 수있는 것처럼 보입니다. 그래서 매우 유용하게 보입니다. 확실히 저장 프로 시저를 조사 할 것입니다. 공유해 주셔서 다시 한 번 감사드립니다. – wes

0

당신은 기본적으로는 일반적으로 하나의 중요한 조정으로 수행하는 방법을 설명하고 있습니다 : : 파일의 FILE_ID이 할 수있는 검색 방법

은 오라클 기반의 저장 프로 시저의 코드입니다 그것을 users_files_ref에 추가하십시오.

일반적으로 데이터베이스 환경에서는 많은 클라이언트가 동시에 연결되어 업데이트를 동시에 수행합니다. 이러한 환경에서는 추가 된 마지막 파일의 file_id를 가져올 수 없습니다. DB 호출 사이에 추가 된 다른 파일 일 수 있습니다. 데이터베이스의 기능을 사용하여 생성 된 ID (예 : MSSQL에서 SELECT @@IDENTITY)를 얻거나 응용 프로그램 코드에서 ID를 어떻게 든 생성해야합니다.

+0

지금 당장 생각해 보면, 저장 프로 시저를 사용하면 그 주위를 빠르게 감쌀 수 있다고 생각합니다. 그런 식으로 데이터베이스가 나를 위해 ID를 만드는 것에 대해 걱정할 수있게 할 수 있습니다. 나는 하나의 tho가 발생하면 높은 교통 상황을 수용하고 싶습니다. 아래 Summer 포스터는 방금 마지막으로 삽입 된 ID를 가져올 PHP 함수를 알려주 었으며 저장 프로 시저를 배울 필요가 없기 때문에 훨씬 쉽게 사용할 수 있습니다. 하지만 문제가 대량 트래픽에서 발생하는지 궁금합니다. 여기에 어떤 경험이 있다면 나는 당신이 가질 수있는 조언을 듣고 싶습니다. 귀하의 의견 Anders 주셔서 감사합니다! – wes

관련 문제