各种用户可以访问数据库中的同一个表,并且每个人都有不同的值吗?

时间:2016-08-11 21:26:26

标签: php mysql apache

好的,我不知道怎么把它放在一个句子里。我打算构建一个Web应用程序,让用户可以跟踪他们阅读的书籍。这些书在MySQL数据库的表中,以及默认设置为false的布尔列'is_complete'。当用户单击“已完成”时,该列中的值将设置为true。

我的问题是:这是否可以使用布尔列的单个书籍表?或者我是否必须为每个用户创建一个包含boolean列和外键(root.books)的表?完成这项工作的最佳方法是什么?我还在学习。

P.S。我正在使用Apache服务器,PHP和MySQL

4 个答案:

答案 0 :(得分:0)

你需要书籍表和用户表和书籍book_users的id为book的书籍和用户的id is_completed(并且你不需要boolean is_completed)

答案 1 :(得分:0)

不可能。任何用户的数据库看起来都一样 您不必为每个用户创建一个表!那将是一个非常愚蠢的解决方案。

只需创建一个包含两列的表:用户ID和书籍ID以及正确的链接/连接/等。如果用户已经阅读了该书,请在此表中添加一行,其中包含相应的用户和书籍ID。要检查用户是否已阅读该书,只需在此新表中查找包含相应用户和书籍ID的行。如果表中有这样的行 - 用户已经完成了本书。如果不是 - 他没有。
由于行无法创建自己,默认值是他还没有读过这本书。通过删除该行,您还可以“更改用户的历史记录” - 这将标记该图书未被该用户完成。

答案 2 :(得分:0)

有些人很快就把你如何为此目的构建数据库的示例sql放在一起 - 尝试尽可能地规范化(我们可以进一步规范化阶段,但这需要另一个表,并且可能不值得为此示例)

你可以在你的gui中运行它,只要你还没有一个名为aphrodite的数据库来观察你自己的结构。

bookworms

然后,当您需要查询特定图书,用户或发布者时,可以推导出以下内容:

drop database if exists `bookworms`;
create database if not exists `bookworms`;
use `bookworms`;


drop table if exists `publishers`;
create table if not exists `publishers` (
  `pid` smallint(5) unsigned not null auto_increment,
  `publisher` varchar(50) not null,
  primary key (`pid`)
) engine=innodb default charset=utf8;


drop table if exists `books`;
create table if not exists `books` (
  `bid` int(10) unsigned not null auto_increment,
  `pid` smallint(5) unsigned not null default 1,
  `title` varchar(50) not null default '0',
  primary key (`bid`),
  key `pid` (`pid`),
  constraint `fk_pid` foreign key (`pid`) references `publishers` (`pid`) on delete cascade on update cascade
) engine=innodb default charset=utf8;


drop table if exists `users`;
create table if not exists `users` (
  `uid` int(10) unsigned not null auto_increment,
  `username` varchar(50) not null default '0',
  primary key (`uid`)
) engine=innodb default charset=utf8;


drop table if exists `library`;
create table if not exists `library` (
  `id` int(10) unsigned not null auto_increment,
  `uid` int(10) unsigned not null default '0',
  `bid` int(10) unsigned not null default '0',
  `status` tinyint(3) unsigned not null default '0' comment 'indicates if the book has been read',
  primary key (`id`),
  key `uid` (`uid`),
  key `bid` (`bid`),
  constraint `fk_bid` foreign key (`bid`) references `books` (`bid`) on delete cascade on update cascade,
  constraint `fk_uid` foreign key (`uid`) references `users` (`uid`) on delete cascade on update cascade
) engine=innodb default charset=utf8;




insert into `publishers` (`pid`, `publisher`) values
    (1, 'unknown'),
    (2, 'penguin'),
    (3, 'faber cassell'),
    (4, 'domino'),
    (5, 'unknown');

insert into `books` (`bid`, `pid`, `title`) values
    (1, 1, 'miss piggy got caught shoplifting'),
    (2, 2, 'my life on crack by kermit the frog');

insert into `users` (`uid`, `username`) values
    (1, 'joe bloggs'),
    (2, 'fred smith'),
    (3, 'john doe');

insert into `library` (`id`, `uid`, `bid`, `status`) values
    (1, 1, 1, 1),
    (2, 2, 2, 1);

答案 3 :(得分:-2)

是的,这是可能的。设置它,以便当每个用户注册每本书时,如您所述,将其设置为false。 这是一个例子: https://i.gyazo.com/4e65fffdcadf2b2df648ef7abef5155d.png

添加每个用户后,该用户的book_id列设置为false。

正如其他人所说,当然你需要用户表,但如果你愿意,你可以只转移user_id并设置一个如上图所示的表,每本书(book_id分为多列)设置为false。经理和理解会更容易。