2

我需要设计一个包含用户和项目的 mysql 数据库。除了其他信息外,项目表还包含有关项目是否存在的信息

  • 对所有用户可见
  • 位于一个或多个地理区域的用户可见
  • 仅对选定用户可见

例如,一个项目可以对位于区域 1、5 和 8 中的所有用户可见,但也对不在区域 1、5 和 8 中的 n 个选定用户可见。

用户的地理区域存储在用户表中(例如 region:4)

我的问题是在哪里存储项目可见性、项目区域和选定用户以及如何向用户显示(选择)所有相关项目。

我需要向用户展示所有项目的列表

  • 对所有用户可见
  • 由于他所在的地区而对用户可见
  • 对用户可见,因为他被选中查看项目

他将不胜感激任何帮助,谢谢!

4

2 回答 2

0

这是表结构。请注意,根据您的 MySQL 版本,您可能需要将 type=INNODB 更改为 ENGINE=INNODB:

drop table if exists prjusers;

drop table if exists proj_users;

drop table if exists project_regions;

drop table if exists projects;

drop table if exists regions;

/*==============================================================*/
/* Table: prjusers                                              */
/*==============================================================*/
create table prjusers
(
   id_prjuser           int not null auto_increment,
   id_region            int not null,
   user_name            varchar(100) not null,
   primary key (id_prjuser)
)
type = InnoDB;

/*==============================================================*/
/* Table: proj_users                                            */
/*==============================================================*/
create table proj_users
(
   id_proj_user         int not null auto_increment,
   id_prjuser           int not null,
   id_project           int not null,
   primary key (id_proj_user)
)
type = InnoDB;

/*==============================================================*/
/* Table: project_regions                                       */
/*==============================================================*/
create table project_regions
(
   id_project_region    int not null auto_increment,
   id_project           int not null,
   id_region            int not null,
   primary key (id_project_region)
)
type = InnoDB;

/*==============================================================*/
/* Table: projects                                              */
/*==============================================================*/
create table projects
(
   id_project           int not null auto_increment,
   prj_code             varchar(100) not null,
   global_project       char(1) not null,
   primary key (id_project)
)
type = InnoDB;

/*==============================================================*/
/* Table: regions                                               */
/*==============================================================*/
create table regions
(
   id_region            int not null auto_increment,
   region_name          varchar(100) not null,
   primary key (id_region)
)
type = InnoDB;

alter table prjusers add constraint FK_relationship_12 foreign key (id_region)
      references regions (id_region) on delete restrict on update restrict;

alter table proj_users add constraint FK_relationship_10 foreign key (id_prjuser)
      references prjusers (id_prjuser) on delete restrict on update restrict;

alter table proj_users add constraint FK_relationship_11 foreign key (id_project)
      references projects (id_project) on delete restrict on update restrict;

alter table project_regions add constraint FK_relationship_8 foreign key (id_project)
      references projects (id_project) on delete restrict on update restrict;

alter table project_regions add constraint FK_relationship_9 foreign key (id_region)
      references regions (id_region) on delete restrict on update restrict;

选择语句:

select id_project, prj_code from projects where global_project='Y'
UNION
select projects.id_project, projects.prj_code 
from projects join project_regions on projects.id_project = project_regions.id_project 
join prjusers on prjusers.id_region = project_regions.id_region
where prjusers.id_prjuser = {$_SESSION['id_prjuser']}
UNION
select projects.id_project, projects.prj_code 
from projects join proj_users on projects.id_project = proj_users.id_project
where proj_users.id_prjuser = {$_SESSION['id_prjuser']}

上面将执行 3 个 UNION 并得出项目 ID 和项目代码是全局的 (1),它们属于登录用户的区域,其 ID 保存在会话变量 (2) 中,以及所有明确的项目分配给该用户。

于 2012-05-20T13:27:28.917 回答
0

USER --------* USER_PROJECT* ----- PROJECT --------*REGION_PROJECT*-----REGION---* USER

USER 和 PROJECT 与映射表 USER_PROJECT 多对多相关

USER 和 REGION 是多对一相关的

PROJECT 和 REGION 与映射表 REGION_PROJECT 多对多相关

此评论旨在补充@somnath 的回答。我无法在评论中添加这种关系。@somnath,我希望我的回答能解释您正确设计的表格之间的关系。

于 2012-05-20T14:18:02.170 回答