关于关系的规范化问题
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
引用了 MyBooks
的 my_booksID
。为什么?
您是否计划在同一用户每次看书时在 Accounts
中创建一个新行?
相反,您应该在 MyBooks
中有一个列 user_id
引用 Accounts
中的 user_id
。
通过这种方式,您可以在 Accounts
和 MyBooks
之间创建 MyBooks
链接 table。
当用户从图书馆借出一本书时,您将在 MyBooks
中添加一个新行,其中包含用户的 user_id
和图书的 bookID
。
此外,在 SQLite 中没有 VARCHAR
和 TIMESTAMP
数据类型(检查 Datatypes In SQLite Version 3)。
在 VARCHAR
的情况下使用 TEXT
而对于 TIMESTAMP
,如果你想以 YYYY-MM-DD
格式存储日期(这是 SQLite 唯一有效的日期格式)使用 TEXT
,或者如果您想将日期存储为 unix 时间戳,请使用 INTEGER
.
我正在寻找有关我当前正在创建的图书馆数据库的指导。
情况
我有一个存储所有用户信息的 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
引用了 MyBooks
的 my_booksID
。为什么?
您是否计划在同一用户每次看书时在 Accounts
中创建一个新行?
相反,您应该在 MyBooks
中有一个列 user_id
引用 Accounts
中的 user_id
。
通过这种方式,您可以在 Accounts
和 MyBooks
之间创建 MyBooks
链接 table。
当用户从图书馆借出一本书时,您将在 MyBooks
中添加一个新行,其中包含用户的 user_id
和图书的 bookID
。
此外,在 SQLite 中没有 VARCHAR
和 TIMESTAMP
数据类型(检查 Datatypes In SQLite Version 3)。
在 VARCHAR
的情况下使用 TEXT
而对于 TIMESTAMP
,如果你想以 YYYY-MM-DD
格式存储日期(这是 SQLite 唯一有效的日期格式)使用 TEXT
,或者如果您想将日期存储为 unix 时间戳,请使用 INTEGER
.