关于关系的规范化问题

Normalisation issues regarding a relationship

我正在寻找有关我当前正在创建的图书馆数据库的指导。

情况
我有一个存储所有用户信息的 Accounts Table
我有一个 Books Table,它存储了这本书的所有信息。
我有一个 MyBooks Table,它试图存储用户从图书馆借出的书籍。

一个用户可以借很多本书,一本书可以被很多用户借(前提是这本书是免费取的)

我的方法
现在,问题是我认为我解决这个问题的方法没有规范化。\

我在实施数据库之前设计的 ERD。

它导致了 table 中的这种情况,它允许 table 存储属于一个用户的多本书。

但是,有人告诉我应该在某个地方有一个链接 table,因为 BookID 可以继续增长,而且它似乎可以非常快地填充 table 并使其变慢,尽管我我不确定这是不是真的。

这是我在 Python 3 中使用 sqlite3 创建数据库时的方法,它实现了我想要的结果,但可能以规范化为代价?

from sqlite3 import connect

conn = connect('LibrarySystem.db')
c = conn.cursor()


c.execute("""CREATE TABLE Accounts (
            user_id INTEGER PRIMARY KEY,
            email_address NVARCHAR(320) NOT NULL DEFAULT '',
            password VARCHAR(60) NOT NULL DEFAULT '',
            staff_mode INTEGER NOT NULL DEFAULT 0,
            my_booksID INTEGER NOT NULL DEFAULT 0,
            FOREIGN KEY(my_booksID) REFERENCES MyBooks(my_bookID)
            )""")
conn.commit()


c.execute("""CREATE TABLE Books (
            bookID INTEGER PRIMARY KEY,
            title VARCHAR(100) NOT NULL DEFAULT '',
            author VARCHAR(100) NOT NULL DEFAULT '',
            genre VARCHAR(100) NOT NULL DEFAULT '',
            issued INTEGER NOT NULL DEFAULT 0,
            FOREIGN KEY(genre) REFERENCES Genres(genre)
            )""")
conn.commit()

c.execute("""CREATE TABLE MyBooks (
            my_booksID INTEGER NOT NULL DEFAULT '',
            bookID INTEGER NOT NULL DEFAULT '',
            date_issued TIMESTAMP NOT NULL DEFAULT '',
            return_date TIMESTAMP NOT NULL DEFAULT '',
            FOREIGN KEY(bookID) REFERENCES Books(bookID)
            )""")
conn.commit()

我的方法是否存在任何规范化问题?\

在 table Accounts 中有一列 my_booksID 引用了 MyBooksmy_booksID。为什么?
您是否计划在同一用户每次看书时在 Accounts 中创建一个新行?

相反,您应该在 MyBooks 中有一个列 user_id 引用 Accounts 中的 user_id
通过这种方式,您可以在 AccountsMyBooks 之间创建 MyBooks 链接 table。

当用户从图书馆借出一本书时,您将在 MyBooks 中添加一个新行,其中包含用户的 user_id 和图书的 bookID

此外,在 SQLite 中没有 VARCHARTIMESTAMP 数据类型(检查 Datatypes In SQLite Version 3)。
VARCHAR 的情况下使用 TEXT 而对于 TIMESTAMP,如果你想以 YYYY-MM-DD 格式存储日期(这是 SQLite 唯一有效的日期格式)使用 TEXT,或者如果您想将日期存储为 unix 时间戳,请使用 INTEGER.