我在确定应该采用何种方法来设计这个数据库时遇到一些麻烦,我无法理解。 如果用户有权查看这些项目,该应用程序将向用户显示一些项目。不同的用户不同的访问权限(可以访问相同的项目)
当用户登录时。首先,他将看到他有权查看的项目列表。
然后他点击了一个项目并转到他有权查看的版本的版本列表(不一定全部都是这样)
然后他点击了该项目的版本,并向他显示了他有权访问的该版本的颠覆列表
因此,不同的用户,不同的访问限制和管理员可以对谁看到哪些版本,颠覆和商品进行更改
+*Item1*
-*ItemN*
*-Version1*
-*Subversion1*
Picture1
Picture2...
+*ItemN+1*
我的问题是如何为这种数据库设计表格(多少,如何连接它们等) 谢谢
答案 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