SQLite个人书籍数据库设计评论

标签 sqlite database-design

我想为我的书籍以及最终的视频游戏和电影建立/管理一个数据库。在我开始填充表格之前,批评、批评和指示是什么?

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 不同,许多数据库系统不需要在 PRIMARY KEY 上使用 NOT NULL。然而 SQLite 文档说 SQLite 确实如此。所以你不需要做任何改变。

书籍与格式之间以及书籍、格式和 ISBN 之间似乎存在两种不同的关系。我不确定您的意图是什么,而且我也不是 ISBN 的主题专家。 BOOK_FORMAT 有什么用途,而 BOOK_FORMAT_ISBN 则没有?

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

尝试和错误是学习数据库的一种非常昂贵的方法,除非您不珍惜自己的时间。虽然您在深入研究之前不需要掌握整本理论教科书,但我建议您至少开始与项目并行地学习数据库背后的理论。与计算的其他方面相比,数据库并不复杂,但它们有点抽象。我对转向数据库的程序员的经验是,他们往往在具体细节方面思考得很好,但在整体抽象结构方面却有些糟糕。您的体验可能会有所不同。

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

帮助您学习的另一种方法是查看其他人解决您同样问题的方法。有一个名为 Database Answers 的组织提供了包含数百个示例数据库模型的库。可用here 。如果您导航到“库”,我相信您会找到一些与您的项目重叠的示例。然而,对它们持保留态度。一个人的最佳实践并不总是适合另一个人的项目目标。

最后,我将向您指出我大约 7 年前就一个问题给出的答案,该答案可能与您的追求相关,也可能不相关。这是what every developer should know about databases .

关于SQLite个人书籍数据库设计评论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44124831/

相关文章:

android - 如何清除 Android ListView 并用新数据填充它?

database - 我的订单明细表可以只有外键吗?

PostgreSQL : NOT VALID constraint vs validation trigger

mysql - 需要一个MYSQL查询来比较两个表并且只输出不匹配的结果

MYSQL 用值填充外部 id

java - 大小为 0 的索引 0 究竟意味着什么?

Android sqlite 插入记录如果不存在

c# - 如何使用 EF 在 SQLite 中启用迁移

sqlite - 在 sqlite 中拆分 FirstName 和 LastName

javascript - 如何在子文档中填充模型实例数组? MongoDB Mongoose