数据库设计问题 - 内容的可见性

时间:2015-07-18 15:36:30

标签: mysql database database-design

我在确定应该采用何种方法来设计这个数据库时遇到一些麻烦,我无法理解。 如果用户有权查看这些项目,该应用程序将向用户显示一些项目。不同的用户不同的访问权限(可以访问相同的项目)

当用户登录时。首先,他将看到他有权查看的项目列表。

然后他点击了一个项目并转到他有权查看的版本的版本列表(不一定全部都是这样)

然后他点击了该项目的版本,并向他显示了他有权访问的该版本的颠覆列表

因此,不同的用户,不同的访问限制和管理员可以对谁看到哪些版本,颠覆和商品进行更改

产品

     +*Item1*
     -*ItemN*
               *-Version1*
                        -*Subversion1*
                                   Picture1
                                   Picture2...
     +*ItemN+1*

我的问题是如何为这种数据库设计表格(多少,如何连接它们等) 谢谢

2 个答案:

答案 0 :(得分:1)

您需要拥有多个表格。我看到这样的结构:

表1项目

项目的每个版本和子版本都被视为项目。

+---------+--------------+--------------+--------
| ITEM_ID | DESCRIPTION  | DATA_FIELD_2 | etc ...
+---------+--------------+--------------+--------
|    ..   |      ..      |      .       |     ...

表2 ITEMS_TREE

此表包含项目(和版本)之间的所有关系

+---------+--------------+--------------+----------+
| TREE_ID |   FATHER_ID  |     SELF     |   ORDER  |
+---------+--------------+--------------+----------+
|    ..   |      ..      |      .       |     ...  |

其中FATHER_ID和SELF是连接到ITEM_ID主键和唯一键的外键。

对于根节点(项),FATHER_ID将为NULL, SELF将引用节点本身(项目或其他)。

版本将具有FATHER_ID,即项目的ITEM_ID,依此类推您想要的级别。

您需要一个用户表和一个权限表,您可以在其中添加用户将能够看到的单个项目,例如:

+---------------+---------+---------+
| PERMISSION_ID | USER_ID | ITEM_ID |
+---------------+---------+---------+
|      ...      |   ..    |    ..   |

每个权限都包含一行。如果您希望让一组人看到相同的项目集合,您可以使用组并使用不同的方式来处理权限,从而避免在数据库中记录太多记录。

示例可以使用GROUP_ID而不是USER_ID,您在该组的可见列表中插入某种项目。

我希望这对你有用,让我知道你对它的看法

答案 1 :(得分:0)

create table items
(   -- endless self-join hierarchy
    itemId int auto_increment primary key,
    parent int not null,    -- 0 if no parent, avoid nulls
    itemName varchar(200) not null, -- "Our Wedding (My 2nd, your 1st)"
    pathToFile varchar(200) null    -- "/users/all/jpg/miama.jpg"
);

create table users
(   userId int auto_increment primary key,
    fullname varchar(100) not null
);

create table items_users_rights_junction
(   id int auto_increment primary key,
    itemId int not null,
    userId int not null,
    rightsMask int not null, -- here is your Visibility

    -- FK's to enforce referential integrity:
    CONSTRAINT fk_rights_items
        FOREIGN KEY (itemId) 
        REFERENCES items(itemId),
    CONSTRAINT fk_rights_users
        FOREIGN KEY (userId) 
        REFERENCES users(userId),
    unique key (itemId,userId), -- no dupes on combo
    key (userId,itemId) -- go the other way, benefits by covered index
);

Subversioning(自然地)烘焙到项目层次结构。随意填充和查询。自我加入的知识会有所帮助。

使它成为(user_id,itemId,rightsMask)上非常有用的覆盖索引,永远不需要转到数据页面获取权限。而是所有都在索引中,最左边是userId。该覆盖指数仍可被视为thin

  

覆盖索引是指选择所有列的情况   由索引覆盖,在这种情况下InnoDB(不是MyISAM)永远不会读   表中的数据,但只使用索引中的数据,   显着加快了选择。

前两个表的一些示例数据:

insert users (fullName) values ('Kim Jones'),('Harry Smith');

truncate table items;   -- will be run a few times to get demo data right
insert items (parent,itemName,pathToFile) values (0,'Our Wedding',null);    -- id #1 top level no parent
insert items (parent,itemName,pathToFile) values (1,'Our Wedding - Cake pictures',null);    #2 place holder
insert items (parent,itemName,pathToFile) values (1,'DJ spins the tunes',null); -- #3 place holder
insert items (parent,itemName,pathToFile) values (2,'She smears cake','/users/all/jpg/miama.jpg');  -- #4
insert items (parent,itemName,pathToFile) values (2,'He feeds the bride','/users/all/jpg/cake123.jpg'); -- #5
insert items (parent,itemName,pathToFile) values (5,'He feeds the bride take 2','/users/all/jpg/cake123-2.jpg'); -- #6
insert items (parent,itemName,pathToFile) values (5,'He feeds the bride take 3','/users/all/jpg/cake123-3.jpg'); -- #7