假设我有销售各种产品的供应商。因此,在基本级别,我将使用以下表格: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
,则不应在Widget 2
表中创建product
的重复条目。这意味着,不知何故,我需要知道vendor-2现在也“拥有”Widget 2
。
拥有一条信息的多个“所有者”的问题是如何处理所有者编辑/删除数据。也许供应商-1不再希望{/ 1}}可供他/她使用,但这不一定适用于供应商-2。
最后,我希望能够将(?)某些记录标记为“是的,我已经审查了这些数据并且它是正确的”,以便随后可供所有供应商使用。假设我将Widget 2
标记为良好数据,现在所有供应商都应该看到该产品。
似乎解决方案是行级安全性。问题是我不太熟悉它的概念或如何在MySQL中实现它。任何帮助都非常感谢。感谢。
注意:此问题在此处有所讨论:Database Design: use composite key as FK, flag data for sharing?。当我问这个问题时,我不确定如何很好地表达这个问题。希望这次我能更好地解释我的问题。
答案 0 :(得分:5)
Mysql本身不支持表上的行级安全性。但是,您可以使用视图来实现它。因此,只需在表上创建一个视图,该视图仅公开您希望给定客户端看到的行。然后,仅提供该客户端对这些视图的访问权限,而不是基础表。
请参阅http://www.sqlmaestro.com/resources/all/row_level_security_mysql/
答案 1 :(得分:1)
您已经建议了供应商,产品和vendor_product映射表。您希望供应商共享同一产品,如果他们都想使用它,但您不想要重复的产品。正确?
如果是,那么在标识产品的自然键上定义一个唯一的索引/约束(产品名称?)。
如果供应商添加了产品,但该产品不存在,请将其插入产品表,然后通过vendor_product表将其映射到该供应商。
如果产品已存在但已映射到其他供应商,请不要在产品表中插入任何内容,并添加将新供应商映射到现有产品的另一个映射行(以便现在将产品映射到两个供应商)
最后,当供应商删除产品而不是实际删除产品时,只需删除映射两者的vendor_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;
最后,如果某个产品由多个供应商所有,那么您可以禁止编辑,也可以在其中一个拥有供应商尝试编辑该产品时将其“拆分”为新的唯一产品,并允许他们编辑自己的产品副本。他们可能需要修改产品名称,除非你想出一些其他自然键来建立你的独特约束。
答案 2 :(得分:0)
这听起来我想要规范化您的数据。你拥有的是1(产品)到许多(供应商)的关系。对于大多数情况,这种关系是1:1而对于某些情况只有1:n并不重要我会说 - 一般来说它仍然是1:n因此你应该以这种方式设计你的数据库。基本布局可能是这样的:
Vendor Table
VendorId VendorName OtherVendorRelatedInformation
WidgetTable
WidgetId WidgetName WidgetFlag CreatorVendor OtherWidgetInformation
WidgetOwnerships
VendorId WidgetId OwnershipStatus OtherInformation
更新:允许谁执行什么是业务问题的问题,因此您需要制定所有规则。在上面的结构中,您可以标记创建窗口小部件的供应商。在所有权中,您可以标记所有权的状态,例如
您必须根据业务规则制作标记,然后相应地设计业务逻辑和数据访问部分。