关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。
两年前关门了。
改进这个问题
我有一个电影院的场景,在这个场景中,员工也可以是客户(因为他们可以买票)。
我创造了两个实体, customer
和 employee
. 如果我能 emp_id
属于 employee
中的外键 customer
这样一来,员工也就成了客户:
客户:客户id、姓名、年龄、员工id
员工:员工id、姓名、年龄
但当我这么做的时候 employee
重复出现在 customer
. 我该怎么办??
2条答案
按热度按时间nhn9ugyo1#
我看你table的第一件事,你不应该真的把东西藏起来
age
. 存储生日或出生年份,这样您就不必每年更新它,因为年龄是相对于当前年份的。请继续阅读,或跳到tl;如果你想听听我的意见的话。
对于你所面临的问题,可以有多种设计选择,我发现它主要基于哪一种选择。
一种选择是创建一个表来存储和人员相关的数据,并在该表中包含人员的类型,这样您就可以拥有客户或员工。这样,您的员工也可以被视为客户,但您知道这是一个特殊的客户。这样,当员工不再是员工时,您可以将其记录转换为客户。
另一种方法是将它们视为您已经拥有的数据,并处理您正在重复数据的事实。除非你有大量的员工(这不应该是电影院的情况),这也是一个有效的方法,因为很明显他们可以是客户,但我假设你想打折他们或出于某种原因区分这两种类型的客户。
想保持目前的状态,但不想重复数据以免出错?更改两个表共享的列并使其可为null。使用触发器或其他一些规则机制来检查
emp_id
填充,然后保留所有其他公共列值null
. 通过这种方式,您将需要注意从附加表中提取数据,因此LEFT JOIN
这里需要提取客户的数据,这些客户也是员工。还有更多的选择。。。
热释光;博士
如果你问我,我很可能会选择第一种方法,将人员相关数据存储在一个表中,或者创建一种人员类型,或者为员工和客户创建不同的表,这些表与人员表的关系为1:1。
也就是说,它可能看起来像:
人员(人员id、姓名、出生年份)
员工(person_id,…)(此处仅存储员工相关数据)
客户(person_id,…)(此处仅存储与客户相关的数据)
顺便说一句,弄清楚你想怎样在总体上区分人们可能是个好主意。您还没有给出整个系统的范围,因此很难给出一些建议。
dkqlctbz2#
如果只有customer和employee两个角色,则可以使用一个表来存储用户,如下所示:
但如果将来考虑更多扩展,可以添加角色表,如下所示:
列
roles
可以存储json数据,如[1,2]
或者像绳子一样1,2
,这取决于你喜欢什么和mysql版本。