让我们考虑三个表:
1.Companies
id
company_name
...
2. Employees
id
employee_name
...
3. Payment
id
pay_by
pay_to
...
现在的问题是,pay_to可以是公司或员工的身份证明(fk)。所以我添加了一个布尔列" is_company"在付款表中。所以我的解决方案是,如果is_company为True,那么其公司否则为其Employee。
但我对这个解决方案不满意。我的意思是我不想要一个具有多表外键的列。我认为有更好的解决方案,但我找不到。请帮助找到更好的解决方案。提前谢谢。
答案 0 :(得分:2)
根据您使用的与数据库交互的内容,您可以在pay_to前加上字母,e代表员工或c代表公司,但是您不能指定该字段是int等可能导致问题。
另一种选择是使用不同的范围(这显然会限制每个范围的数量),但可以说0-9999999是员工,10000000 +是公司ID。
另一种选择是拥有一个临时表(例如称为收款人),其中pay_to引用该表中的一行,该行为您提供收款人类型,然后是各自表中的收款人ID。 - 编辑 - 您可以创建一个名为payees的表,其中包含payee_id,payee_type,id等列。 payee_id将是一个自动增量列,您可以在payment.pay_to字段中引用该列。 payee_type将是公司/员工,然后id将是company.id或employee.id,具体取决于类型。这意味着使用2个查询而不是使用连接,但除非您可以将公司和员工合并到一个表中,否则任何可能性都是如此 - 这将取决于您在原始问题中详述的其他列。< / p>
它们都不一定是优雅的(并且可能存在,可能还有其他)解决方案,但它们将是我在您的情况下使用的3个!
答案 1 :(得分:0)
根据Ed Wade所说的内容,您可以为所有companies
添加1
前缀,将所有employees
添加前缀为2
。这有助于将字段保持为整数,而不限制您可以存储的数字