Sql 覆盖用户/产品权限所需的最小组数

Sql 覆盖用户/产品权限所需的最小组数,sql,sql-server,relational-division,Sql,Sql Server,Relational Division,我有一份365位客户的名单。他们每个人都有一个潜在的唯一的产品列表,允许他们订购,目前24种产品中最多有18种。我想使用组来分配权限。如何确定唯一权限集的最小数量 我有一种预感,答案涉及到关系划分,但我仍然不清楚它是如何工作的 澄清一下:我不仅仅对哪些用户拥有完全相同的权限感兴趣。我想找到我可以使用的组,每个用户可能是多个组的成员,可以复制权限。例如,A组可能有权访问99498;B组有权访问99507、99508、99512。下面截断数据中的所有三个用户都是A的成员,只有前两个是B的成员 CRE

我有一份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.

多亏了Anon和Gordon Linoff,还有我自己的谷歌搜索:这是封面问题的一个例子,也许更难,解决这个问题根本不值得。我们将采用24组解决方案,一些用户一次是18个组的成员。这是众所周知的远远不是最小的,但它将工作,这就是我们所需要的。只有输入阶段需要小心。

如果这是与安全/权限相关的,那么安全组权限是否应该预先定义,因为每个组中应该允许哪些产品?如果您是根据用户过去订购的产品自动生成安全组,那么接下来将如何管理这些安全组?这个问题的关键是集合论,而不是SQL。对于您的目的来说,一个接近但可能不是最优的答案是否足够好?如果是这样的话,一个简单的贪婪算法可能是最简单的。@Anon:接近但非最优的算法肯定足够好了。谢谢你的链接。这似乎比封面问题更难,因为你必须确保没有额外的产品分配给用户。考虑两个用户,一个有19个产品,一个有18个产品,其中19个产品是18个另外一个。这两个客户不能使用相同的组,尽管可能存在重叠。我根本不认为使用组进行此操作有什么好处。只需让每位客户访问其拥有的产品即可。