문제

나는 지금 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이 다시 추가되지 않습니다).

테이블에 카운트를 저장하지 마십시오. 실행시 기존 데이터를 기반으로 숫자를 생성 할 수 있도록 뷰를 사용하십시오.

  1. 사용자 이름을 기본 ID로 사용하지 않습니다. 나는 자동화로 숫자 ID를 만들 것입니다
  2. 관계 테이블에서 새 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!
);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top