比方说,我有卖各种产品的供应商。因此,在基本级别上,我将有以下表:vendor、product、vendor_product。
如果vendor-1将Widget 1添加到product表中,我只希望vendor-1能看到该信息(因为该信息归vendor-1所有)。供应商-2也是如此。假设vendor-2添加了Widget 2,则只有vendor-2应该看到该信息。
如果vendor-1尝试添加已经由vendor-2输入的Widget 2,则不应在product表中创建重复的Widget 2条目。这意味着,不知何故,我需要知道vendor-2现在也“拥有”Widget 2。
拥有一条信息的多个“所有者”的问题是如何处理所有者编辑/删除数据。也许vendor-1不再希望Widget 2对他/她可用,但这不一定适用于vendor-2。
最后,我希望能够标记(?)某些记录为“是的,我已经审查了这些数据,它是正确的”,这样它就可以提供给所有的供应商。假设我将Widget 1标记为良好的数据,那么所有供应商现在都应该可以看到该产品。
似乎解决方案是行级安全性。问题是我不太熟悉它的概念,也不太熟悉如何在MySQL中实现它。任何帮助都是非常感谢的。谢谢。
注意:这里稍微讨论了这个问题:Database Design: use composite key as FK, flag data for sharing?。当我问这个问题时,我不确定如何很好地表达这个问题。希望这次我能更好地解释我的问题。
发布于 2011-04-03 10:19:31
Mysql本身并不支持表的行级安全性。但是,您可以使用视图来实现它。因此,只需在您的表上创建一个视图,该视图只显示您希望给定客户端看到的行。然后,只为客户端提供对这些视图的访问,而不是底层表。
请参阅http://www.sqlmaestro.com/resources/all/row_level_security_mysql/
发布于 2011-04-03 11:25:42
您已经建议了供应商、产品和vendor_product映射表。您希望供应商共享相同的产品,如果他们都想使用它,但您不希望重复的产品。对吗?
如果是,那么在标识产品(产品名称?)的自然键上定义一个惟一的索引/约束。
如果供应商添加了一个产品,但该产品不存在,请将其插入到product表中,并通过vendor_product表将其映射到该供应商。
如果该产品已经存在,但已映射到另一个供应商,则不要在product表中插入任何内容,并添加另一个映射行,将新的供应商映射到现有产品(以便现在该产品映射到两个供应商)。
最后,当供应商删除一个产品时,只需删除映射两者的vendor_product引用,而不是实际删除它。最后,如果没有其他供应商仍在引用某个产品,您可以删除该产品。或者,您可以定期运行一个脚本,删除不再有供应商引用的所有产品。
最后,在product表上设置一个标志,表明您已经审查了该产品,然后使用类似下面的内容来查询给定供应商(我们称之为供应商id 7)可查看的产品:
select product.*
from product
left join vendor_map
on vendor_map.product_id = product.product_id
where vendor_map.vendor_id = 7
or product.reviewed = 1;最后,如果一个产品由多个供应商所有,那么您可以禁止编辑,或者当其中一个拥有产品的供应商尝试编辑该产品时,您可以将该产品“分割”为一个新的唯一产品,并允许他们编辑该产品的自己的副本。但是,他们可能需要修改产品名称,除非您想出一些其他的自然关键字来作为唯一约束的基础。
发布于 2011-04-03 10:38:47
在我看来,您想要规范化您的数据。您拥有的是1(产品)与多(供应商)的关系。对于大多数情况,这种关系是1:1,而对于某些情况,这种关系只有1:n,我想说这并不重要--一般来说,它仍然是1:n,因此,您应该以这种方式设计数据库。基本布局可能是这样的:
Vendor Table
VendorId VendorName OtherVendorRelatedInformation
WidgetTable
WidgetId WidgetName WidgetFlag CreatorVendor OtherWidgetInformation
WidgetOwnerships
VendorId WidgetId OwnershipStatus OtherInformation更新:谁被允许做什么的问题是一个业务问题,所以你需要制定所有的规则。在上面的结构中,您可以标记哪个供应商创建了小部件。在所有权中,您可以标记所有权的状态,例如
您必须根据业务规则构造标志,然后相应地设计业务逻辑和数据访问部分。
https://stackoverflow.com/questions/5527129
复制相似问题