문제
나는 지금 WebApp을 만들고 있으며 데이터베이스 디자인을 둘러싼 머리를 잡으려고 노력하고 있습니다.
사용자 모델 (사용자 이름 (기본 키), 비밀번호, 이메일, 웹 사이트) 입력 모델 (ID, 제목, 콘텐츠, 댓글, CommentCount)이 있습니다.
사용자는 항목에 한 번만 댓글을 달 수 있습니다. 이 작업을 수행하는 가장 좋고 효율적인 방법은 무엇입니까?
현재 사용자 이름 (사용자 모델에서)과 항목 ID (Entry Model)가있는 다른 테이블을 생각하고 있습니다.
**username id**
Sonic 4
Sonic 5
Knuckles 2
Sonic 6
Amy 15
Sonic 20
Knuckles 5
Amy 4
따라서 Entry 4에 대한 주석을 나열하려면 ID = 4를 검색합니다.
참고 사항 :댓글을 저장하는 대신 필요할 때마다 데이터베이스에서 댓글 수를 계산하는 것이 좋습니다.
해결책
당신의 디자인은 기본적으로 건전합니다. 세 번째 테이블은 Fields 사용자 이름, EntryId 및 Comment와 함께 UsersentRiesComments와 같은 이름을 지정해야합니다. 이 표에는 사용자 이름과 EntryID 필드로 구성된 복합 기본 키가 있습니다. 이렇게하면 각 사용자가 각 항목에 한 번만 댓글을 달 수있는 규칙이 시행됩니다. 테이블에는 사용자 이름이 사용자 테이블에 있어야하고 EntryID가 항목 테이블 (특히 ID 필드)에 있어야하는 외국의 주요 제약 조건이 있습니다.
사용자 테이블에 ID 필드를 추가 할 수 있지만 많은 프로그래머 (직접 포함)는 가능한 경우 "천연"키 사용을 옹호합니다. 사용자 이름은 시스템에서 고유해야하므로 완벽하게 유효하고 쉽게 읽을 수있는 기본 키입니다.
업데이트: 다시 질문을 읽으십시오. 항목 테이블에 주석이나 댓글을 담은 필드가 필요하지 않습니다. 주석은 usersentriescomments 테이블에 올바르게 저장되며 쿼리에서 수는 동적으로 계산됩니다 (이 값을 직접 업데이트하는 데 어려움을 저장).
업데이트 2: James Black은 ~ 아니다 사용자 이름을 기본 키로 사용하고 대신 테이블에 인공 기본 키를 추가합니다 (userID 또는 일부). 사용자 이름을 기본 키로 사용하는 경우 사용자 이름을 변경할 수있는 것이 더 어렵습니다. 모든 관련 테이블에서 사용자 이름을 변경해야하므로 사용자 이름을 변경해야합니다.
다른 팁
당신은 정확히 무엇을 의미합니까?
entry model(id, title, content, **comments**, commentCount)
(강조 광산)? 엔티티 당 여러 주석이있는 것처럼 보이므로 별도의 테이블에 저장해야합니다.
comments(id, entry_id, content, user_id)
entry_id
그리고 user_id
각각의 테이블에 대한 외국 키입니다. 이제 독특한 색인을 만들면됩니다 (entry_id
, user_id
) 사용자가 엔티티 당 하나의 주석 만 추가 할 수 있도록합니다.
또한 사용자 이름을 PK로 만드는 대신 사용자 테이블의 대리 (시퀀스 / ID를 통해 생성 된 숫자) 기본 키를 만들 수 있습니다.
데이터 모델에 대한 권장 사항은 다음과 같습니다.
사용자 테이블
- user_id (pk, int)
- 사용자 이름
- 비밀번호
- 이메일
- 웹 사이트
기입 테이블
- Entry_id (PK, int)
- Entry_title
- 콘텐츠
Entry_comments 테이블
- Entry_id (PK, FK)
- user_id (pk, fk)
- 논평
이 설정을 사용하면 항목이 0 개 이상의 주석을 가질 수 있습니다. 주석이 추가되면 기본 키는 복합 키입니다. ENTRY_ID
그리고 USER_ID
쌍은 테이블에 한 번만 존재할 수 있음을 의미합니다 (예 : 1, 1은 1, 1이 다시 추가되지 않습니다).
테이블에 카운트를 저장하지 마십시오. 실행시 기존 데이터를 기반으로 숫자를 생성 할 수 있도록 뷰를 사용하십시오.
- 사용자 이름을 기본 ID로 사용하지 않습니다. 나는 자동화로 숫자 ID를 만들 것입니다
- 관계 테이블에서 새 ID를 사용하여 2 개의 필드에 고유 한 키를 사용합니다.
문제가되지 않더라도 기본 키인 userID를 원할 수도 있습니다. 그렇지 않으면 사용자가 사용자 이름을 변경하거나 특정 사람들이 사용자 이름을 변경할 수 없다는 것을 알게되면 어려울 수 있습니다.
결합 된 테이블에 userID 및 entryID에 고유 한 제약 조건을 갖습니다. 이렇게하면 데이터베이스가 댓글/항목/사용자가 하나만 있다고 강요합니다.
데이터베이스를 지정하면 BTW를 지정하면 도움이됩니다.
주석 세트가 독특하다는 것을 보장하고 싶은 것 같습니다. 관련하여 username
엑스 post_id
. 고유 한 제약 조건을 사용하거나 데이터베이스 시스템이 그 명시 적으로 지원하지 않는 경우, 동일한 인덱스를 사용하여이를 수행 할 수 있습니다. 다음은 다음을 표현하는 SQL입니다.
CREATE TABLE users (
username VARCHAR(10) PRIMARY KEY,
-- any other data ...
);
CREATE TABLE posts (
post_id INTEGER PRIMARY KEY,
-- any other data ...
);
CREATE TABLE comments (
username VARCHAR(10) REFERENCES users(username),
post_id INTEGER REFERENCES posts(post_id),
-- any other data ...
UNIQUE (username, post_id) -- Here's the important bit!
);