我有一个仓库表和一个客户表来管理属于不同客户的几个仓库
warehouse
=====
id
address
capacity
owner_client
client
=====
id
name
我的问题是,我有一个ACME客户,而ACME的“ACME安全评级”属性仅适用于他们的仓库。目前我们只将其作为仓库领域,并将其作为非极端仓库的零件。但这感觉不对,需要一些解决方法和特殊情况。
什么是代表这个的最佳方式?我曾想过用仓库中的数字和FK制作一个“Acme安全评级”表,但是现在我已经为一个客户制作了一张桌子?如果我们需要为baz客户端开始跟踪“is_foobar_accesible”怎么办?
答案 0 :(得分:1)
执行此操作的相对纯粹的方法是实现您的初始建议,即具有单独的表,例如ACME_WAREHOUSES,其中包含仅适用于此客户端的SAFTEY_RATING等属性。将为具有自己的属性的每个客户端创建不同的CLIENT_WAREHOUSES表。通过这种方式,您可以使用标准数据库约束功能来确保这些表中数据的完整性。
另一种方法是在WAREHOUSES表中添加一系列可为空的列,例如ACME_SAFETY_RATING和BAZ_FOOBAR_ACCESSIBLE。这不是关系纯粹的,因为它意味着此表中可以存在空值。但是,您仍然可以使用标准数据库功能来确保数据的完整性。如果在某些情况下某些值是强制性的,则可能会更复杂。此外,如果有许多客户端具有许多不同的属性,则表中的列数可能变得难以处理。
另一种方法是实体 - 属性 - 值模型。通常,如果可能的话,应该避免这种情况。它不是关系纯的,因为现在不再在域上定义列值,并且如果不是不可能的话,确保数据的完整性是非常困难的。任何真正的尝试都需要大量的定制编码(需要仔细实现以满足数据库约束免费提供的并发控制等),因为您无法使用标准数据库约束。但是,如果您只是想存储信息值而不对它们做任何事情,则可以使用此方法。
EAV方法确实存在这样的危险,因为它似乎很容易向实体添加属性,它成为默认的方式。然后,它用于添加重要处理所依赖的属性,并且由于无法使用此方法确保数据的完整性,您会发现正在使用的值无意义,并且处理的整个逻辑基础被破坏。
答案 1 :(得分:-2)
我会创建一个ClientProperty和ClientWarehousePropertyValue表,以便您可以为每个仓库存储这些客户拥有的属性及其值:
ClientProperty
===============
ID
ClientID
Name
ClientWarehousePropertyValue
============================
WarehouseID
ClientPropertyID
Value