mysql - 功能齐全的个人图书馆系统的数据库设计,链接标题,作者,系列,注释和标签

标签 mysql database-design

问题:此设计中是否有任何应为正确的数据库实践而更改的内容,或者可能是一个问题(例如,wildplasser对author。* name的评论是唯一的要求)。

问题2:
这是获取每个作者的书籍数量的最有效的查询吗?

select 
  (select concat(authors.fname,authors.mname,authors.lname) 
   from authors 
   where authors.authorid=bal.authorid
  ) name, 
  count(bal.bookid) as cnt 
from books_authors_link bal 
group by bal.authorid order by cnt asc;


背景:
我已经使用这种模式进行了几周的测试,并且我想确保自己不会陷入困境。我已经阅读过StackOverflow上的大量帖子,有关数据库设计的内容,等等。我已经下载了开源库管理软件,并检查了数据库设计。

看,我已经看到我可以清理每个表的主键了……
我还希望能够提取每位作者的书籍总数。

我已在下面每个表名称的上方复制了我的表注释。

目标:狂热的电子书阅读器的图书馆管理系统。


系统将导入所述读者拥有的书籍,并从文件名和内容中收集标题,作者,系列和标签。系统将对文件内容进行哈希处理,然后将其导入数据库。系统将获取文件的内容,并将它们的哈希值存储在文件系统中。
读者可以按作者,标题,系列或标签浏览。读者可以将标签添加到书中。
读者可以编辑一本书,然后再次添加,系统将识别出已添加该书的新版本(标题/作者匹配)。这对于古腾堡(Gutenberg)图书非常有用,因为用户希望编辑该图书并保存两个版本。这样,如果读者想在旅途中读一本全由詹姆斯·帕特森(James Patterson)撰写的书籍,或者是标有“ award 2011”或“ gutenberg”标记的书籍,则他/她可以搜索这些要求并导出干净的图书清单(也可以选择将图书转换为与电子阅读器兼容的格式)。
用户将来可能会共享书籍数据,尽管这不包括书籍文件本身。


我知道Calibre已经存在,并且是执行此操作的出色系统。但是,我正在尝试添加功能(例如系列列表)和完全可以通过网络使用的产品。可访问性也是一个重点。我的某些表与Calibre的表相似,但我尝试偏离Calibre的设计。

任何人的任何想法将不胜感激。

表格:

唯一的书本,指的是特定的书本,例如一个ISBN,可以具有多个版本和/或格式

create table books (
  id INTEGER PRIMARY KEY AUTO_INCREMENT, 
  bookid varchar(40) NOT NULL, 
  title TEXT, 
  unique (bookid)
);


持有作者(许多作家,书籍作家)

create table authors (
  id INTEGER PRIMARY KEY AUTO_INCREMENT, 
  authorid varchar(40) NOT NULL, 
  pfix text (50) binary, 
  fname text (50) binary, 
  mname text (50) binary, 
  lname text (50) binary, 
  sfix text (50) binary, 
  unique (pfix (50), fname (50), mname (50), lname (50), sfix (50))
) ENGINE = MyISAM;


书籍出版商

create table publishers (
  id INTEGER PRIMARY KEY AUTO_INCREMENT, 
  publisherid varchar(40), 
  name TEXT, 
  unique (publisherid)
);


拥有系列名称,唯一的系列ID

create table series (
  id INTEGER PRIMARY KEY AUTO_INCREMENT, 
  seriesid varchar(40), 
  seriesname TEXT, 
  unique (seriesid)
);


持有书籍,作者,系列和其他标签的标签
virtual指定导出图书时可用作系列名称的标签

create table tags (
  id INTEGER PRIMARY KEY AUTO_INCREMENT, 
  virtual boolean, 
  tagtype varchar(20), 
  tagname TEXT, 
  refid varchar(40), 
  parentid varchar(40), 
  instanceid varchar(40)
);


持有书籍实例的笔记,例如您可以编辑H.G.Wells的《世界战争》,并在实例标记中添加注释,并进行编辑,例如“第1-3章和第50-53页”,flagname =“ edit”,flagvalue =“ True”
如果您有一本书,然后再获得另一个系列或组中的一本书,例如年度最佳小说,因此每本书的数据都存储在同一数据中,并在此表下带有注释,并按instanceid链接该书

create table instanceflags (
  instanceid varchar(40), 
  flagname varchar(50), 
  flagvalue varchar(50), 
  flagnotes varchar(250)
);


存放所有书籍档案
通过散列在文件系统上存储文件的单个副本,以节省空间
instanceid指的是书的特定编辑版本
bookid是一本书(请参考books表以获取匹配的bookid值)
hash是文件内容的md5哈希
提取压缩的书并以此为注释,其中内部路径保存在original_ {path,filename}中,扩展名表示压缩类型

create table files (
  id INTEGER PRIMARY KEY AUTO_INCREMENT, 
  instanceid varchar(40), 
  bookid varchar(40), 
  hash varchar(64), 
  extension varchar(6), 
  original_filepath varchar(255), 
  original_filename varchar(255)
);


链接书籍和作者
可能需要更改表名称,以免无意间复制Calibre

create table books_authors_link (
  bookid varchar(40) NOT NULL, 
  authorid varchar(40) NOT NULL, 
  unique (bookid,authorid)
);


链接发布者

create table books_publishers_link (
  bookid varchar(40) NOT NULL, 
  publisherid varchar(40) NOT NULL, 
  unique (bookid,publisherid)
);


拥有系列到书籍的链接
通过这种方式,可以针对一系列图书中的缺失书籍进行报告,例如女子谋杀俱乐部,有1和10,缺少2-9

create table books_series_link (
  bookid varchar(40) NOT NULL, 
  seriesid varchar(40) NOT NULL, 
  seriesnum float DEFAULT 0
);

最佳答案

问题2:这是拉取数量最有效的查询
  每个作者的书?


如果bookid标识了一项作者身份的作品,那么您将按以下方式计算每个作者的书籍数量:

select authorid, count(*) num_books
from book_authors_link
group by authorid


您可以加入以获得作者的名字。

但是我认为您正在陷入困境。作者是人,人的名字也不是唯一的。同样,您的列名显示出对人的名字的偏爱。 Everything you think you know about people's names is wrong

如果没有外键支持,则一年之内几乎有100%的机会获得不良数据。

几乎每个表都有一个整数id和一个varchar(40)id。该整数从不使用。我认为这是一个错误。

关于mysql - 功能齐全的个人图书馆系统的数据库设计,链接标题,作者,系列,注释和标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7940248/

相关文章:

MySql 通过排除另一个表中的所有 id 进行选择

mysql - 将复杂连接更改为 Sequel 关联

mysql - 如何在laravel中计算百分比

mysql - 查询具有零对多关系的表

mysql - MySQL 数据库的约束列表

mysql - mysql中float(2,2)和float()的区别

DATE 数据每年的 MYSQL COUNT

sql - 具有 Multi-Tenancy 数据库的示例应用程序

c# - 创建具有动态字段的数据库

mysql - 数据库设计: multiple values for single field in a record