2013-12-10 32 views
5

In meiner Geschäftslogik habe ich einen Benutzer, ein Unternehmen (Benutzer können Teil des Unternehmens sein, als Mitarbeiter, ich würde sie "Agenten" nennen) und Produkte.Entwerfen einer Datenbank zum Verfolgen des Besitzers

Ein Produkt kann von einem Benutzer oder von einem Unternehmen besessen werden, das Unternehmen kann es später einem Benutzer (Agenten) zuweisen, aber es wäre immer noch Eigentum des Unternehmens (falls das Unternehmen den Agenten auslöst).

Mein Gedanke ist, die Benutzertabelle, die Firma Tabelle und die Produkttabelle und eine Tabelle zu haben, zu verfolgen, wer der Eigentümer des Produkts ist:

-------------- 
| 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| 
---------------- 

Wenn das Produkt von einem Benutzer besessen wird dann nur product_id und user_id werden gefüllt. Wenn es sich um eine Firma handelt, sind product_id, company_id und agent_assigned gefüllt.

Später möchte ich ein Produkt ziehen und wissen, wer der Besitzer ist: die Benutzerinformationen, oder die Agenten- und Firmeninformationen.

Ist dies der beste Weg? Es scheint mir nicht gut zu sein.

+0

Wir haben eine Kontaktdatenbank. Jeder Kontakt muss zu (mindestens) einer Organisation gehören, aber einige dieser Organisationen sind etwas abstrakt - z. 'Projekt x Kundengruppe'. In Ihrem Szenario würde also jedes Produkt einer Organisation gehören, auch wenn einige dieser Organisationen in gewissem Sinne fiktiv sind. Diese Frage entspricht nicht genau den Anforderungen von SO, aber ich verbessere es trotzdem, weil ich es mag. – Strawberry

+0

Es ist nicht notwendig, company_id in product_owner zu speichern - diese Information ist bereits in der agents-Tabelle enthalten. Eine weitere Möglichkeit besteht darin, owner_id immer im selben Feld zu speichern und ein weiteres Feld hinzuzufügen, das den Owner-Typ definiert. – niyou

+0

Warum nicht: Owner_type, Owner_ID, Slave_type, Slave_ID. Und rammt einfach jede mögliche Beziehung hinein. Auf diese Weise kann alles auf die gleiche Weise gehandhabt werden, und Sie können auch die Zuordnung von Elementen zu mehreren Eigentümern zulassen. OT = 'Unternehmen', OI = company_id_2, ST = 'Produkt', SI = product_id_25 – Viridis

Antwort

0

Verwenden Sie den Standard Party Model. Lesen Sie Table Vererbung um es zu implementieren.

Ein Vermögenswert wird durch eine legale Partei gehört. Es könnte eine Einzelperson sein, eine Gruppe von Individuen (sagen wir die Familie Jones), eine Regierung, eine Firma. Sie müssen diese konkreten Typen zu einem abstrakten Typ abstrahieren, sodass Sie einen einzelnen Fremdschlüssel auf sie zeigen können.

0

Basierend auf Ihren Anforderungen glaube ich nicht, dass Sie zu weit weg sind. Ich würde die Produkte trennen, die jedoch zu Unternehmen und Benutzer gehören und in etwa wie folgt machen:

enter image description here

Dann, wenn Sie ein Produkt ziehen müssen und finden Sie den Besitzer einfach eine Abfrage beitreten müssen. Etwas wie folgt aus:

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 = ? 

Ich sage nicht, dass Syntax korrekt ist oder wird für Sie arbeiten, es ist nur ein Beispiel dafür, was man braucht, zu tun.

+0

Die Sache mit dieser Lösung ist, dass die ProdcutOwner nur eine Benutzer-ID haben. Was passiert, wenn das Unternehmen den Agenten "feuert"? Dann wäre das Produkt ohne Besitzer. Ich möchte das Unternehmen als Eigentümer des Produkts halten, auch wenn ich die Agenten Feuer – raygo

+0

Die Art und Weisen Sie es beschreiben, sind, würden Sie den Standardwert von 'NULL' in' userid' auf der 'ProductOwner' Seite? Dies ist ein schlechtes Design, weshalb ich entschied, sie in "ProductOwner" und "CompanyOwner" zu trennen. Wenn ein Agent gefeuert wird, kann der Datensatz von "ProductOwner" einfach gelöscht werden, während Sie den Datensatz darüber behalten, welches Unternehmen das Produkt in "CompanyProduct" besitzt.Zumindest sehe ich das Design so. – Dan

+0

Ok. Ich könnte ein bisschen verwirrt sein. Wenn ich dann sehen möchte, ob das Produkt einem Benutzer, einem Agenten oder nur einem Unternehmen gehört, muss ich jedes Mal zuerst in CompanyProducts und dann in ProductOwner suchen. Danke für die Hilfe btw – raygo

Verwandte Themen