2013-12-10 1 views
5

내 비즈니스 논리에서 나는 사용자, 회사 (사용자는 회사의 일부가 될 수 있으며 직원으로, 나는 "에이전트"라고 부름) 및 제품을 보유하고 있습니다.소유자를 추적하는 데이터베이스 설계

제품을 사용자 또는 회사가 소유 할 수있는 회사는 나중에 사용자 (에이전트)에게 할당 할 수 있지만 회사가 계속 소유하게됩니다 (회사에서 에이전트를 실행할 경우).

내 생각은 제품의 소유자가 누구인지 추적 할 수있는 사용자 테이블, 회사 테이블과 제품 테이블과 테이블을 가지고있다 : 제품이 사용자가 소유하는 경우

-------------- 
| users | 
-------------- 
| user_id | 
| name  | 
-------------- 
-------------- 
| products | 
-------------- 
| product_id | 
| title  | 
-------------- 
-------------- 
| company | 
-------------- 
| company_id | 
| name  | 
-------------- 

-------------- 
| agents | 
-------------- 
| agent_id | 
| user_id | 
| company_id | 
-------------- 

---------------- 
|product_owner | 
---------------- 
|  id  | 
| product_id | 
| user_id  | 
| company_id | 
|agent_assigned| 
---------------- 

을 만 product_id 및 user_id가 채워집니다. 회사가 소유 한 경우 product_id, company_id 및 agent_assigned가 채워집니다.

나중에 제품을 가져 와서 소유자가 누구인지 알고 싶습니다 (사용자 정보 또는 에이전트 및 회사 정보).

이렇게하는 것이 가장 좋은 방법입니까? 그게 나에게 좋지 않은 것 같아.

+0

연락처 데이터베이스가 있습니다. 모든 연락처는 (적어도) 하나의 조직에 속해야하지만 일부 조직은 약간 추상적입니다. '프로젝트 x 클라이언트 그룹'. 따라서 시나리오에 따라 모든 제품은 조직에서 소유하게 될 것입니다. 이러한 조직 중 일부는 가상의 의미를 지니기는하지만 말입니다. 이 질문은 SO의 요구 사항에 엄격히 부합하지 않지만, 어쨌든 나는 그것을 좋아한다. 왜냐하면 나는 그것을 좋아한다. – Strawberry

+0

product_owner에 company_id를 저장할 필요가 없습니다.이 정보는 이미 agents 테이블에 보관되어 있습니다. 또 다른 가능성은 같은 필드에 항상 owner_id를 저장하고 owner_type, Owner_ID, slave_type, slave_ID와 같은 소유자 유형 – niyou

+0

을 정의하는 다른 필드를 추가하는 것입니다. 그리고 거기에 가능한 모든 관계를 두십시오. 이렇게하면 모든 것을 동일한 방식으로 처리 할 수 ​​있고 항목을 여러 소유자에게 할당 할 수 있습니다. OT = 'company', OI = company_id_2, ST = 'product', SI = product_id_25 – Viridis

답변

0

표준 Party Model을 사용하십시오. 그것을 구현하기위한 상속은 Table에 있습니다.

자산이 합법적 인 당사자의 소유입니다. 개인, 개인 집단 (존스 가족), 정부, 회사 일 수 있습니다. 이러한 구체적인 유형을 하나의 추상 유형으로 추상화하여 하나의 외부 키를 가리킬 수 있어야합니다.

0

귀하의 요구 사항에 따라 나는 너무 멀다고 생각하지 않습니다. 나는 이런 식으로 그러나 회사와 사용자에 속하는 제품을 분리하고 그것을 만들 것입니다 :

enter image description here

을 그럼 당신은 제품을 당겨 그냥 쿼리에 가입해야 할 주인을 찾아야 할 때. 이런 식으로 뭔가 : 그 구문이 올바른지 또는 당신을 위해 작동 말하는 게 아니에요

select * from product p 
left join companyproduct cp on p.id = cp.product 
join productowner po on cp.productid = po.productid 
join agent a on po.userid = a.userid 
where p.id = ? AND a.userid = ? 

, 그것은 당신이해야 할 것이 무엇 단지 예입니다.

+0

이 솔루션을 사용하면 ProdcutOwner가 사용자 ID 만 가질 수 있습니다. 회사가 에이전트를 "해고"하면 어떻게 될까요? 그렇다면 제품은 소유자가 없을 것입니다. 나는 에이전트를 실행하더라도 회사를 제품의 소유자로 유지하고 싶습니다. – raygo

+0

당신이 설명하는 방식대로, 당신은'ProductOwner' 페이지의'userid'에'NULL'의 기본값을 가질 수 있을까요? 이것은 내가 'ProductOwner'와 'CompanyOwner'로 분리 한 이유입니다. 에이전트가 해고되면'ProductOwner'의 레코드가 삭제 될 수있는 반면,'CompanyProduct'에는 어떤 회사가 제품을 소유하고 있는지 기록을 남기게됩니다.적어도 그것이 디자인을 보는 방법입니다. – Dan

+0

확인. 나는 조금 혼란 스러울지도 모른다. 그런 다음 제품이 사용자, 에이전트 또는 회사 소유인지 확인하려면 CompanyProducts를 먼저 살펴보고 매번 ProductOwner를 살펴보아야합니다. 도움 주셔서 감사합니다 btw – raygo