我正在尝试制定具有三个基本实体的参考书目数据库的结构:
text
(散文、文章等)、publication
(包含这些文本的书籍、期刊等)和 maker
(作者、编辑等)。
页码被证明是其中最棘手的部分之一。由于英文数字范围的格式化规则很复杂,因此我想让软件进行格式化,并让用户只需输入单独的页码。最初我将这些作为
text
表中的列:
first_page SMALLINT,
last_page SMALLINT
但是对于像这篇从第 135 页跳到第 206 页的杂志文章来说,这不起作用:
此外,报纸页码通常是字母数字,例如“C9–C10”、“1E、7E”或“WC13”。
所以看来我需要一个额外的表,
page_range
,以及数据类型更改:
range_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
text_id INT FOREIGN KEY REFERENCES text(text_id),
first_page VARCHAR,
last_page VARCHAR,
range_ordinal TINYINT
我的问题:这真的是最好的方法吗?为本质上只是
text
的一个属性创建一个完整的表感觉有点过分。我走在正确的道路上吗,还是有更好的方法?
如果您只想要一个具有一系列页面范围的字符串,那么您可以使用
VARCHAR
或 TEXT
。但请将此字符串视为逐字。也就是说,您可以将完整列表存储或获取完整列表作为原子字符串。您不使用 SQL 表达式来搜索、排序或编辑列表。
但是,如果您想使用 SQL 表达式处理各个页面范围,例如计算有多少个范围,或编辑页面范围列表,或搜索特定页面范围,则创建第二个表并将它们存储在多个页面中该表的行。