2012-03-17 5 views
0

나는 가상의 웹 사이트에서 아이템을 판매해야하며, 테이블 몇 개가 생겨서 누군가가이 사실을 알 수 있다면 궁금 해서요.데이터베이스 테이블 디자인 - 내 필드가 정확합니까?

나는 라인을 따라 생각하고있다. ID, 이름, 비용, mediaType 매개 (FK)

미디어 : 테이블

제품 나를 혼란 무엇 ID, 이름 (책, CD, DVD 등)

는 사용자가 가질 수 있다는 것입니다/자신의 많은 제품이 있지만, 제품 ID의 배열을 단일 열에 어떻게 저장할 것입니까?

감사합니다.

+0

그냥 생각해 보니, 실제로 사용자 ID와 제품 ID가있는 구매 테이블이있을 수 있습니까? – Biscuit128

답변

0

당신은 하나의 열에 모든 것들을 저장하지 않을 것입니다. 사실 보통 별도의 열에 저장하지 않을 것입니다.

디자인에서 약간 벗어나서 세 번째 정규 양식을 조사해야합니다. 이것이 시작점이되어야하며 대다수의 경우 데이터베이스 스키마 설계의 끝점이어야합니다. 하나의 객체가 특정 사용자와 연결되어있는 단순한 형태의

Users 
    User ID (primary key) 
    Name 
    Other user info 
Objects: 
    Object Id (primary key) 
    User id (foreign key, references Users(User id) 
    Other object info 

:하지만,

가변 크기 "배열"을 처리하는 올바른 방법은이 하나 개의 관계에 많은있는 테이블, 같은 함께 특정 사용자는 임의의 수의 객체를 가질 수 있습니다.

오브젝트가 여러 사용자에 의해 "소유"될 수있는 경우 (예를 들어, 오브젝트가 "세일즈맨의 죽음"을 의미하는) 오브젝트를 말하지만 분명히 각 사용자는 자신의 사본 오브젝트 조인 테이블을 사용하십시오.

Users 
    User ID (primary key) 
    Name 
    Other user info 
Objects: 
    Object Id (primary key) 
    User id (foreign key, references Users(User id)) 
    Other object info 
UserObjects: 
    User id (foreign key, references Users(User id)) 
    Object id (foreign key, references Objects(Object id)) 
    Count 
    primary key (User id, Object id) 

마찬가지로, 사용자 ID를 오브젝트 테이블에 추가하여 하나 이상 처리 할 수 ​​있습니다.

그러나 가장 간단한 형식을 이해하고 3NF를 이해할 때까지는 일반적으로 문제가되지 않습니다.

0

사용자가 제품을 많이 가지고 있거나 소유하고 있다는 것을 혼란스럽게 생각하지만 제품 ID 배열을 단일 열에 저장하는 방법은 무엇입니까?

"다 대다"관계라고합니다. 당신은 사용자가 어떤 제품을 알고 싶을 때 그런 다음 같은 쿼리를 수행 할 수

[table] Users 
    - id 
    - name 
[table] Products 
    - id 
    - name 
    - price 
[table] Users_Products 
    - user_id 
    - product_id 

을 : 본질적으로 당신은 사용자를위한 테이블, 제품에 대한 테이블이처럼 그들을 매핑 테이블을 것이다 :

SELECT product_id FROM Users_Products WHERE user_id=23; 

물론 사용자 ID 23은 예를 들어 의미가 있습니다. 결과 레코드 세트에는 사용자가 소유 한 모든 제품의 ID가 포함됩니다.

+0

예 - 저는이 정확한 종이 예제를 생각했지만 구매 표로 사용했습니다! – Biscuit128

+0

그건 일대 다가 아니라 다 대다입니다. 일대 다 (one-to-many)의 경우 주어진 제품은 오직 한 사용자에게만 속할 수 있기 때문에 별도의 조인 테이블이 필요하지 않습니다. – paxdiablo

+0

많은 사용자가 동일한 제품 유형을 구입할 수 있습니까? – Biscuit128

0

텍스트 또는 varchar 필드에 JSON 배열을 저장하고 응용 프로그램이 파싱을 처리하도록 할 수 있습니다.

MySQL에는 PostgreSQL과 달리 기본 배열 유형이 없지만 일반적으로 배열을 저장하려고하면 일반적으로 잘못된 것으로 나타납니다. 물론 모든 규칙에는 예외가 있습니다.

아마도 사용자 테이블과 사용자 테이블을 비교하면됩니다. 제품이 한 사용자와 만 관련 될 경우 사용자 ID 열을 Products 테이블에 추가 할 수 있습니다. 그렇지 않으면 다 대다 관계를 처리하는 또 다른 조회 테이블이 필요할 것입니다. 그것은 다음과 같이 보일 것입니다 :

------------------------ 
| user_id | product_id | 
------------------------ 
|  1 |   1 | 
|  1 |   2 | 
|  1 |   3 | 
|  2 |   2 | 
|  3 |   1 | 
|  3 |   5 | 
------------------------ 
0

내가 하나 개의 컬럼이 제품 ID는 쉼표 같은 몇 가지 구분 기호로 분리 된 문자열로 저장하는 것입니다에 사용자가 가지고있는 모든 제품을 저장하는 한 가지 방법을 생각한다. 이것이 당신이 풀고 싶은 방식은 아니지만. 이 문제를 해결하는 가장 좋은 방법은 별도의 사용자 테이블을 가지고 사용자 ID와 제품 ID를 연관시키는 사용자 제품 테이블을 갖는 것입니다. 간단한 쿼리를 사용하여 특정 사용자 ID가 소유 한 모든 제품의 목록을 얻을 수 있습니다.

0

시작 지점에서 시스템을 주요 부품으로 생각해보십시오. '웨어 하우스'가 있어야합니다. 그래서 당신은 당신이 가지고있는 제품을 나열하기위한 테이블이 필요하고, 정기적 인 방문을 위해 당신의 세부 사항을 등록하는 사용자가있을 것입니다 - 그래서 사용자 당 계정. 일반적으로 동일한 테이블의 동일한 행에 단일 제품의 모든 세부 사항을 보유합니다 (세부 사항은 실제로는 복잡한 제품이 아니지만 가능하지는 않습니다). 사용자 계정별로 구입 한 제품을 추적 할 경우 큰 텍스트 필드에 구분 된 목록으로 주문 내역을 보관할 수있는 옵션이 항상 있습니다. 예 : 날짜, 아이디, 아이디, 아이디, 아이디, 날짜, 아이디, 아이디. 또는 단순히 주문 번호를 참조하고 [고객이 주문한] 주문에 대한 별도의 테이블을 가질 수 있습니다.

관련 문제