Php 设计一个数据库来跟踪所有者

Php 设计一个数据库来跟踪所有者,php,mysql,sql,database-design,Php,Mysql,Sql,Database Design,在我的业务逻辑中,我有一个用户,一个公司(用户可以是公司的一部分,作为员工,我称他们为“代理”)和产品 产品可以归用户所有,也可以归公司所有,公司可以稍后将其分配给用户(代理),但它仍然归公司所有(以防公司解雇代理) 我的想法是拥有用户表、公司表和产品表,以及跟踪谁是产品所有者的表: -------------- | users | -------------- | user_id | | name | -------------- -------------- |

在我的业务逻辑中,我有一个用户,一个公司(用户可以是公司的一部分,作为员工,我称他们为“代理”)和产品

产品可以归用户所有,也可以归公司所有,公司可以稍后将其分配给用户(代理),但它仍然归公司所有(以防公司解雇代理)

我的想法是拥有用户表、公司表和产品表,以及跟踪谁是产品所有者的表:

--------------
|   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|
----------------
如果产品归用户所有,则仅填写产品id和用户id。如果它是由一家公司拥有的,那么将填写产品id、公司id和指定的代理

稍后,我会想拉一个产品,并知道谁是所有者:用户信息,或代理和公司信息


这是最好的方法吗?对我来说似乎没那么好

根据你的要求,我认为你还不算太远。然而,我会将属于公司和用户的产品分开,并将其制成如下:

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

然后,当您需要提取产品并找到所有者时,您只需要一个连接查询。大概是这样的:

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 = ?
我并不是说语法是正确的或者对你有用,它只是你需要做的一个例子。

使用标准。仔细阅读继承以实现它


资产由合法方拥有。它可以是一个人,一组个人(比如琼斯家族),一个政府,一家公司。您需要将这些具体类型抽象为一个抽象类型,这样您就可以用一个外键指向它们。

我们有一个联系人数据库。每个联系人必须属于(至少)一个组织,但其中一些组织有点抽象,例如“x项目客户群”。因此,在您的场景中,每个产品都将由一个组织拥有,即使其中一些组织在某种意义上是虚构的。这个问题并没有严格符合SO的要求,但我还是要增加它,因为我喜欢它。没有必要将公司id存储在product\u owner中-此信息已保存在agents表中。另一种可能是将owner\u id始终存储在同一个字段中,并添加另一个定义owner类型的字段why not:owner\u type、owner\u id、slave\u type、slave\u id。并在其中存储所有可能的关系。这样,一切都可以以相同的方式处理,您也可以将项目分配给多个所有者。OT='company',OI=company\u id\u 2,ST='product',SI=product\u id\u 25此解决方案的问题是ProdcutOwner只有一个用户id。如果公司“解雇”了代理人该怎么办。那么产品就没有所有者了。我想让公司成为产品的所有者,即使我按您描述的方式解雇代理,您在
ProductOwner
页面上的
userid
中会有默认值
NULL
?这是一个糟糕的设计,这就是为什么我选择将它们分为
ProductOwner
CompanyOwner
。如果某个代理被解雇,则可以删除
ProductOwner
中的记录,而您将在
CompanyProduct
中保留哪个公司拥有该产品的记录。至少,我是这样看待这个设计的。我可能有点困惑。然后,如果我想知道产品是属于用户、代理商还是公司所有,我每次都必须先查看CompanyProducts,然后再查看ProductOwner?谢谢你的帮助,也许我误解了你的描述,用户总是代理吗?产品总是由公司所有吗?如果是这样,那么您肯定需要对这些表进行联接查询,以找到所需的信息。如果一个产品一次只能由一个实体拥有,则情况不同。否。代理始终是用户,但用户不需要是代理。产品可以归公司或用户所有。公司可以将代理(用户)设置为所有者,但只能临时设置。与其说是所有者,不如说是代理商对产品“负责”。一个产品可能有多个代理商负责