制作个人图书数据库(使用sqlite)。

Making a personal book database (with sqlite). Looking for design critiques

我对编程并不陌生,但对SQL和数据库却相当陌生。我想为我所有的书建立/管理一个数据库(并最终为我的电子游戏和电影做同样的事情)。我已经设计了一些东西。但在我真正开始制作和填充表格之前,我正在寻找你可能有的批评、批评和指点。以下是我的初步设计。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
BOOK (
    book_id INTEGER PRIMARY KEY ASC AUTOINCREMENT NOT NULL,
    title TEXT NOT NULL,
    active_ind INTEGER NOT NULL DEFAULT 1,
    read_ind INTEGER NOT NULL DEFAULT 0
)

AUTHOR (
    author_id INTEGER PRIMARY KEY ASC AUTOINCREMENT NOT NULL,
    name TEXT NOT NULL
)

FORMAT (
    format_id INTEGER PRIMARY KEY ASC AUTOINCREMENT NOT NULL,
    format TEXT NOT NULL
)

ISBN (
    isbn_id INTEGER PRIMARY KEY ASC AUTOINCREMENT NOT NULL,
    isbn TEXT NOT NULL
)

BOOK_FORMAT (
    book_id INTEGER REFERENCES BOOK (book_id),
    format_id INTEGER REFERENCES FORMAT (format_id)
)

BOOK_AUTHOR (
    book_id INTEGER REFERENCES BOOK (book_id),
    author_id INTEGER REFERENCES AUTHOR (author_id)
)

BOOK_FORMAT_ISBN (
    book_id INTEGER REFERENCES BOOK (book_id),
    format_id INTEGER REFERENCES FORMAT (format_id),
    isbn_id INTEGER REFERENCES ISBN (isbn_id)
)

我对ISBN的结构还是有点不确定。我还想把这本书的出版日期添加到某个地方的数据中,但我并不完全确定它在哪里最合适。我很欣赏所有的指点!


我的回答有点含糊,因为我不确定你在这个项目中的意图是什么,不管这只是一种爱好还是一个在你的专业证书中添加数据库专业知识的前奏。

我将在传递过程中注意到,与SQLite不同,许多数据库系统在主键上不需要空值。然而,sqlite文档说sqlite可以。所以你不需要改变。

书籍和格式以及书籍、格式和ISBN之间似乎存在两种不同的关系。我不知道你在这里的意图是什么,我也不是ISBNS的主题专家。书籍版式有什么作用,而书籍版式ISBN也不起作用?

在主表中没有嵌入外键(引用约束)。这与我设计的每一个数据库都不同,尽管据我所知,它可能适合您的情况。一般来说,当关系是多对多或是三元时,可以使用连接表来表示关系,正如您所做的那样。如果您需要表示一个多对一关系,您会发现将其嵌入实体表比为关系创建单独的表更方便。

试用和错误是学习数据库的一种非常昂贵的方法,除非你不珍惜自己的时间。虽然你不需要在潜入研究之前掌握一本完整的理论教科书,但我建议你至少要开始学习与你的项目并行的数据库背后的理论。与计算的其他方面相比,数据库并不复杂,但它们有点抽象。我与程序员切换到数据库的经验是,他们倾向于在具体细节方面考虑得很好,但在总体抽象结构方面有点差。你的经历可能不同。

面向对象建模是许多程序员获得的更强大的抽象工具之一。不幸的是,数据建模和对象建模常常导致不同的思维模式,许多程序员发现数据建模很难精确掌握,因为对象建模对他们非常有用。

另一个帮助你学习的方法是看别人解决你同样问题的方法。有一个名为"数据库应答"的组织提供了一个包含数百个示例数据库模型的库。这里有。如果您导航到"库",我相信您会发现一些与您的项目重叠的示例。不过,还是要加一粒盐。一个人的最佳实践并不总是适合另一个人的项目目标。

最后,我要告诉你一个我7年前给你的答案,这个问题可能与你的任务有关,也可能与你的任务无关。这是每个开发人员都应该了解的数据库。

祝你好运!


如果您要添加图书的出版日期,而不是创建tbl_Publication表,并按如下方式修改您的所有表,请按照standerd来确定这里的所有代码tbl表示这是表名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
tbl_Book (
    Book_Id INTEGER PRIMARY KEY ASC AUTOINCREMENT NOT NULL,
    Title TEXT NOT NULL,
    Active_Ind INTEGER NOT NULL DEFAULT 1,
    Read_Ind INTEGER NOT NULL DEFAULT 0
)

tbl_Publication (
    Publication_Id INTEGER PRIMARY KEY ASC AUTOINCREMENT NOT NULL,
    Publication_Name TEXT NOT NULL
)

tbl_Author(
    Author_Id INTEGER PRIMARY KEY ASC AUTOINCREMENT NOT NULL,
    Author_Name TEXT NOT NULL
)

tbl_Format (
    Format_Id INTEGER PRIMARY KEY ASC AUTOINCREMENT NOT NULL,
    Format TEXT NOT NULL
)

tbl_ISBN (
    ISBN_Id INTEGER PRIMARY KEY ASC AUTOINCREMENT NOT NULL,
    ISBN TEXT NOT NULL
)

tbl_Book_Full_Details(
    Book_FD_Id INTEGER PRIMARY KEY ASC AUTOINCREMENT NOT NULL,
    Book_Id INTEGER REFERENCES tbl_Book(Book_Id),
    Author_Id INTEGER REFERENCES tbl_Author(Author_Id),
    Format_Id INTEGER REFERENCES tbl_Format (Format_Id),
    ISBN_Id INTEGER REFERENCES tbl_ISBN (ISBN_Id),
    Publication_Id INTEGER REFERENCES tbl_Publication (Publication_Id),
    Publication_Date DATETIME
)