制作个人图书数据库(使用sqlite)。寻找设计批评

时间:2017-05-23 02:30:03

标签: sqlite database-design

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

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结构仍然有点不确定。我也想把这本书的出版日期添加到某个地方的数据中,但我不确定它最合适的地方。我很欣赏任何指针!

2 个答案:

答案 0 :(得分:2)

如果您想要添加图书的发布日期而不是创建tbl_Publication表格并修改您的所有表格,请按照下面的标准进行修改,并在此处查看所有代码tbl代表这是表名

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
)

答案 1 :(得分:2)

我的回答有点模糊,因为我不确定你在这个项目中的目的是什么,无论是业余爱好还是将数据库专业知识添加到你的专业证书中的前奏。

我注意到,与SQLite不同,许多数据库系统在PRIMARY KEY之上不需要NOT NULL。然而,SQLite文档说SQLite有。所以你不需要改变一切。

书籍和格式之间以及书籍,格式和ISBN之间似乎存在两种不同的关系。我不确定你的意图是什么,我不是ISBN的主题专家。 BOOK_FORMAT服务的目的是什么 - BOOK_FORMAT_ISBN还没有提供服务?

主表中没有嵌入外键(REFERENCES约束)。这与我设计的每个数据库都不同,但据我所知,它可能适用于您的情况。通常,关系用连接表表示,就像你所做的那样,当关系是多对多,或者是三元关系时。如果您需要表达多对一关系,您会发现将它嵌入实体表中比为关系创建单独的表更方便。

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

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

另一种帮助您学习的方法是看看其他人解决同一问题的方式。有一个名为Database Answers的组织提供了一个包含数百个示例数据库模型的库。它可用here。如果您导航到" Libraries"我确定您会找到一些与您的项目重叠的示例。然而,带上一粒盐。一个人的最佳实践并不总是适合其他人的项目目标。

最后,我要指出一个大约7年前我给出的一个问题,答案可能与你的任务有关,也可能没有。它是what every developer should know about databases

祝你好运!