我正在尝试创建一个简单的零售连锁型数据库模型的ER图。你有你的客户,不同的商店,库存等等。
我的第一个问题是,如何表示一个在商店下单的顾客。如果客户是一个折扣卡持有者,公司有他们的名字,地址等,所以我可以有一个cardHolder实体连接到具有订单关系的项目和商店。但是,我如何表示由不是数据库中真正实体的客户下的订单呢?
其次,有条件的.在ER图中表示的东西,例如在汽车经销商中,客户在购买汽车时可能会选择一个或多个可选的额外选项。我认为有一个具有相关属性和选项作为多值属性的汽车实体,但是您如何表示用户在订单关系中选择这些选项(例如,订单表显示已订购的汽车、选择的额外服务以及额外服务的添加成本)?
发布于 2017-02-24 13:51:26
首先,您是否真的需要将客户建模为不同的实体,或者您只需要订单、付款和交付详细信息?许多零售系统不会跟踪个人顾客。如果需要,您可以有一个带有代理键和唯一约束的customer表,用于标识SSN或折扣卡号等属性(即使这些属性是可选的)。通常很难防止客户表中的重复,因为对于人们来说没有理想的自然键,所以考虑一下这是否真的是必需的。
如何对可选的附加组件进行建模取决于它们所依赖的内容。一些额外的可能是制造或型号特定的,例如,某些颜色的选择或手动/自动变速器。延长保修期可能是全面可用的。
下面是一个特定于汽车的可选附加组件的示例:
car (car_id PK, make, model, color, vin, price, ...)
car_extras (extra_id PK, car_id FK, option_name, price)
order (order_id PK, date_time, car_id FK, customer_id FK, payment_id FK, discount)
order_extras (order_id PK/FK, car_id FK, extra_id PK/FK)我排除了价格合计,因为它们可以通过聚合查询来计算。
在我的示例中,order_extras.car_id是冗余的,但通过使用复合FK约束来支持更好的完整性(即(order_id, car_id)引用order中的相应列,而(car_id, extra_id)引用car_optional_extras中的相应列,以防止无效的额外项链接到订单)。
下面是上表的ER图:

发布于 2017-02-24 14:35:44
首先,根据你的想法,你肯定可以有两种客户。优惠卡持有者,他们的详细信息存在于公司中,而新客户的详细信息不能在公司中获得。
有三种可能的方法来实现你正在尝试的东西,1)在系统中有两个不同的订单表(我个人不建议这样做) 2)在系统中有一个单一的订单表,并获得那些折扣卡持有者的详细信息。3)对于系统中只有一个订单表的新客户/未注册客户,在折扣卡持有者表中插入一行。
拥有单一的顺序表将使系统标准化,并且在执行许多其他操作时将更加方便。
其次,为了解决您的问题,您需要遵循规范化。它将减少当前面临的问题,还将使系统变得自由冗余,并使实体变得轻量级,这将直接影响到当您变大时的性能。
通过在使用外键生成账单时添加额外选择的项目,可以在针对客户的订单中列出这些项目。处理关键字将导致快速和健壮的结果,而不是在不同的地方存储冗余/重复的细节。
通过遵循规范化,可以通过在您希望引用数据的任何地方应用外键来处理问题,以避免出现问题或错误。
最好是NF4更好。看看下面的规范化入门链接。
https://stackoverflow.com/questions/42393766
复制相似问题