2011-11-22 4 views
2

블로그 게시 엔티티가 있다고 가정합니다.이 MySQL 스키마는 어떻게 만들 수 있습니까?

  • 그것은이 많은 속성은
  • 이 코멘트에 첨부했다.
  • 많은 상태 (삭제/잠김/숨김 등)가 있습니다.
  • 많은 "태그"가 있습니다. (키워드, school_id, user_id)

분명히 의견은 블로그 테이블과 다 대일 관계가있는 고유 한 테이블이어야합니다.

"상태"또는 "태그"는 무엇입니까? 그걸 다른 테이블에 놓을 래? 아니면 많은 열에 붙이시겠습니까?

속성이 너무 커지면 어떨까요? 내 웹 사이트가 성장함에 따라 블로그 게시물에는 더 많은 속성 (제목, 작성자, 어쩌구, blah ....)이 첨부됩니다. 속성 목록이 100보다 높으면 어떻게됩니까?

+2

항상 다른 테이블에 있습니다. 단일 필드에 이들을 포함 시키면 관계형 데이터베이스를 갖는 목적이 무효화됩니다. 즉, 관련성을 잃을 수 있습니다. –

+0

"states"는 자체 테이블일까요? – TIMEX

+0

상태는 게시물 테이블의 열이어야합니다. 키워드는 확실히 별도의 테이블에 있어야하며 게시물 ID와 관련이 있으며 키워드 및 게시물 ID 열 모두에 기본 키가 있어야합니다. 속성 목록이 늘어나는 이유를 모르겠다. 어떤 종류의 구조를 유지하려고한다면, 속성 목록은 같아야합니다. 따라서 속성을 포스트 테이블의 컬럼으로 사용하는 것이 좋습니다. –

답변

1

먼저 상태는 밀접하게 구조화 된 것이어야합니다. 따라서 각 상태는 별도의 열을 만들어야합니다. 처음에는 무엇이 필요한지 생각해보십시오. 나중에 하나 또는 두 개의 열을 쉽게 추가 할 수 있습니다.

키워드와 같은 태그는 시간이 지남에 따라 빠르게 증가하기 때문에 열에 저장하면 안됩니다. 그건 아무 의미가 없어요. 그래서 그 안에 id와 keyword가 들어있는 테이블과 post_id와 keyword_id가있는 링크 테이블을 만듭니다. keyword_id를 생략하고 직접 post_id 및 키워드를 연결할 수도 있습니다. 결합 된 두 열이 모두 기본 키를 정의하는지 확인하여 특정 게시물 하나에 여러 번 저장된 키워드로 끝낼 수 없습니다.

속성의 경우 동일 할 수 있습니다. attribute_id, attribute_name 및 아마도 더 많은 정보와 link_attribute_id 및 post_id 및 content 테이블로 속성 테이블을 만드는 것은 나쁜 습관이 아닙니다. attribute_ids를 사용하여 다국어로 쉽게 확장 할 수도 있습니다.

주석은 사용자 및 게시물에 대한 링크가있는 별도의 테이블에 저장됩니다 (comment_id, user_id, post_id, content 및 아마도 parent_id). 주석을 다시 주석으로 달길 원하면 comment_id 일 수 있습니다.

간단한 개요입니다. 당신이 사용할 수있는 다른 방법이 있습니다 .. .. 그냥 샘플입니다 다시

:

+0

감사합니다. 그러나 왜 "국가"가 자체 테이블이 될 수없는가? 그리고 나서 저는 포스트와 일대일 관계를 맺었습니다. 10-20 개 주가 있다고 상상하기 때문에 ... – TIMEX

+0

좋아, 상태에 대해 별도의 테이블을 갖는 것은 문제가되지 않습니다. 나는 당신이 가진 국가의 양을 알지 못했습니다. 그러나 항상 테이블과 조인을 주시해야합니다. 하나의 게시물에 대한 모든 데이터를 가져 오는 것은 다른 테이블에서 많은 정보를 검색하는 것을 의미합니다. –

+0

그럼, mysql 태그로 질문을 게시 했으므로 다음과 같은 질문은 전혀 관련이 없지만 다른 데이터베이스에 대해 생각해 보는 것이 좋습니다. 게시물뿐만 아니라 다른 유형의 데이터 (페이지, 기사 등)를 저장하려고 할 때 속성이 변경되고 상태가 변경되는 경우 NoSQL DB (예 : CouchDB)를 사용할 수 있습니다. 나 자신을 위해 나는 현재 그것을 정확하게 조사하고있다. –

2

다음은 샘플입니다.여기

우리가 간다 :

-- basic-basic blog 
CREATE TABLE blog_entry (
    blog_entry_id INT NOT NULL AUTO_INCREMENT, 
    blog_entry_title VARCHAR(255) NOT NULL, 
    blog_entry_text VARCHAR(4000) NOT NULL, 
    create_date DATETIME, 
    state_id INT 
); 

-- create a look-up table for your blog entry's state 
CREATE TABLE be_state (
    state_id INT NOT NULL AUTO_INCREMENT, 
    name CHAR(30) NOT NULL, 
    PRIMARY KEY (state_id) 
); 

-- create a look-up table for your blog entry's tag/s 
CREATE TABLE be_tag (
    tag_id INT NOT NULL AUTO_INCREMENT, 
    name CHAR(30) NOT NULL, 
    PRIMARY KEY (tag_id) 
); 

-- a table to store multiple tags to one entry 
CREATE TABLE blog_entry_tags (
    blog_entry_id INT NOT NULL, 
    tag_id INT NOT NULL, 
    PRIMARY KEY (blog_entry_id, tag_id) 
); 

-- a table to store definitions of attributes 
CREATE TABLE be_attribute (
    attribute_id INT NOT NULL AUTO_INCREMENT, 
    name CHAR(30) 
); 

-- now have a table to which you can assign multiple attributes to one blog 
-- of course, this is if I understand you correctly 
-- where you want to have additional attributes 
-- aside from the basic properties of a blog entry 
-- and will allow you, if you choose to do it 
-- to not necessarily have all attributes for each entry 
CREATE TABLE blog_entry_attributes (
    blog_entry_id INT NOT NULL, 
    attribute_id INT NOT NULL, 
    PRIMARY KEY (blog_entry_id, attribute_id) 
    -- PK enforces one blog entry may have only one attribute of its type 
    -- meaning, no multiple attributes of 'location' attribute, 
    -- for example, for one blog. Unless of course you wrote half the entry 
    -- in one location and finished it in the next.. then you should 
    -- NOT enforce this primary key 
); 
  1. blog_entry - 제품이

  2. be_state 이동 메인 테이블을 - 여기를 정의하고, blog_entry.state_id

  3. 자신의 state_id 값을 삽입

    be_tag - 여기처럼 여러 태그가 있습니다

  4. blog_entry_tags - 하나의 블로그 항목에 여러 개의 태그가있을 수 있으므로 여기에 저장하고 blog_entry.blog_entry_id 및 해당하는 be_tag.tag_id을 함께 삽입하십시오. 블로그 항목 당 하나의 태그가 있습니다. 태그 # 1 (예 :)에 php 태그를 두 번 이상 태그 할 수 없음을 의미합니다.

  5. be_attribute - 유사한 blog_entry_tags에 하나 또는 블로그 항목에 하나 이상의 be_attribute을 할당 할 수 있습니다 - 여기 등의 위치, 저자,

  6. blog_entry_attributes 같은 매장 속성 정의.

이 방법은 다시 한 가지 방법 일뿐입니다.

+0

나는 그것이 긴 게시물 인 것을 안다. 그러나 나는 그것이 어떻게 든 그것에 관해가는 길에 당신에게 아이디어를주는 것을 도울 것이기를 바란다. .. 이것은 내가 지금 요리했던 단지 예이다. 그래서 그것은 최고가 아닐 것이다. – Nonym

+0

고마워요! 이것은 정말로 도움이됩니다. – TIMEX

관련 문제