覆盖用户/产品权限所需的最少组数
Posted
技术标签:
【中文标题】覆盖用户/产品权限所需的最少组数【英文标题】:Minimal number of groups necessary to cover user/product permissions 【发布时间】:2014-08-15 21:22:16 【问题描述】:我有一个包含 365 位客户的列表。他们每个人都有一个潜在的唯一允许订购的产品列表,最多 24 种产品中的 18 种(目前)。我想使用组来分配权限。如何确定唯一权限集的最小数量?
我有一种预感,答案涉及到关系划分,但我对它的工作原理仍然很模糊。
澄清:我不仅对哪些用户拥有完全相同的权限感兴趣。我想找到我可以使用的组,每个用户可能是多个组的成员,可以重现权限。例如,组“A”可能拥有对 99498 的权限;组“B”拥有 99507、99508、99512 的权限。以下截断数据中的所有三个用户都是“A”的成员,只有前两个用户是“B”的成员。
CREATE TABLE UsersProducts (
[User] INTEGER NOT NULL,
[Product] INTEGER NOT NULL,
PRIMARY KEY ([User],[Product])
)
CREATE TABLE GroupsProducts (
[Group] INTEGER NOT NULL,
[Product] INTEGER NOT NULL,
PRIMARY KEY ([Group],[Product])
)
CREATE TABLE GroupsUsers (
[Group] INTEGER NOT NULL,
[User] INTEGER NOT NULL,
PRIMARY KEY ([Group],[User])
)
-- Given this UsersProducts information, I want
--the GroupsProducts and GroupsUsers tables filled.
INSERT UsersProducts
( [User],[Product] )
VALUES (11804,99498),
(11804,99506),
(11804,99507),
(11804,99508),
(11804,99512),
(11804,99547),
(11804,99592),
(11804,99594),
(11804,99647),
(11804,99658),
(11804,99660),
(11804,99667),
(11804,99694),
(11804,99700),
(11804,99771),
(11947,99498),
(11947,99506),
(11947,99507),
(11947,99508),
(11947,99512),
(11947,99547),
(11947,99592),
(11947,99594),
(11947,99647),
(11947,99658),
(11947,99660),
(11947,99667),
(11947,99700),
(11947,99720),
(11947,99771),
(12009,99498),
(12009,99506),
(12009,99507),
(12009,99508),
(12009,99512),
(12009,99547),
(12009,99575),
(12009,99592),
(12009,99594),
(12009,99596),
(12009,99647),
(12009,99658),
(12009,99660),
(12009,99667),
(12009,99694),
(12009,99700),
(12009,99720),
(12009,99771),
(12353,99498),
(12353,99512),
(12353,99547),
(12353,99575),
(12353,99592),
(12353,99594),
(12353,99596),
(12353,99647),
(12353,99658),
(12353,99660),
(12353,99667),
(12353,99694)
-- etc. 365 distinct users, 28 distinct products. 4012 pairings.
【问题讨论】:
如果这是与安全/权限相关的,那么安全组权限是否应该已经预先定义,就每个组中应该允许哪些产品而言?如果您要根据用户过去订购的产品自动生成安全组,那么您将如何管理这些安全组? en.wikipedia.org/wiki/Set_cover_problem 这个问题的关键是集合论,而不是 SQL。 “接近但可能不是最佳”的答案是否足以满足您的目的?如果是这样,一个简单的贪心算法可能是最简单的。 @Anon:接近但非最佳绝对足够好。感谢您的链接。 这些似乎比 set-cover 问题更难,因为您必须确保没有为用户分配额外的产品。考虑两个用户,一个有 19 个产品,一个有 18 个产品,其中 19 个产品是 18 个加上另一个。尽管可能存在重叠,但这两个客户不能使用相同的组。我根本看不到为此使用组的优势。只需让每个客户访问他/他/它拥有的产品。 【参考方案1】:感谢 Anon 和 Gordon Linoff,以及我自己在谷歌上的大量搜索:这是场景覆盖问题的一个示例,或者可能更困难,解决这个问题是不值得的。我们将采用 24 组解决方案,其中一些用户一次是 18 个组的成员。众所周知,这远非最小,但它会起作用,这就是我们所需要的。只有输入阶段需要小心。
【讨论】:
以上是关于覆盖用户/产品权限所需的最少组数的主要内容,如果未能解决你的问题,请参考以下文章
Python 一直在覆盖以前的情节,但没有用所需的情节保存它