2015-04-05 85 views
0

我很难决定如何在我的相册数据库中存储发布日期。有些专辑有月份,日期和年份,但其他专辑只有一年。如果我想显示这两种格式,如何存储这些发布日期?我注意到allmusic.com这样做。我的同事告诉我他认为他们将月份,日期和年份存储为数据库中的单独字段,但我想这会使得按时间顺序排列相册变得困难。有关如何完成这些任务的任何建议?当某些记录有月/日/年,而其他记录只有一年时如何存储日期?

我正在使用MySQL,但我问这是关于关系数据库设计的一般问题。

+0

您是否尝试将此信息存储为varchar字段? – 2015-04-06 06:31:10

+1

参见http://programmers.stackexchange.com/questions/194286/how-do-you-store-fuzzy-dates-into-a-database – 2015-04-06 19:08:31

回答

1

我会使用DATE类型存储日期并使用精确度列。

SQL Fiddle

MySQL的架构

CREATE TABLE Album(
    Title    VARCHAR(40), 
    ReleaseDate   DATE, 
    ReleaseDateAccuracy ENUM('D', 'M', 'Y') 
); 

INSERT INTO Album 
    (Title, ReleaseDate, ReleaseDateAccuracy) 
VALUES 
    ('Foo', '2015-01-01', 'Y'), 
    ('Bar', '2015-04-01', 'M'), 
    ('Baz', '2015-04-06', 'D'); 

查询

SELECT Title, 
    CASE ReleaseDateAccuracy 
    WHEN 'Y' THEN DATE_FORMAT(ReleaseDate, '%Y') 
    WHEN 'M' THEN DATE_FORMAT(ReleaseDate, '%Y-%m') 
    WHEN 'D' THEN DATE_FORMAT(ReleaseDate, '%Y-%m-%d') 
    END AS FormattedDate 
    FROM Album 

结果

| Title | FormattedDate | 
|-------|---------------| 
| Foo |   2015 | 
| Bar |  2015-04 | 
| Baz | 2015-04-06 | 
1

'2010-01-15'是日期。 '2010'不是。

有几种方法来处理这样的数据。使用单独的年份,月份和日期列是一种选择,但它有一些缺点。

一方面,保证组合值代表真实日期非常复杂,特别是使用MySQL。 MySQL不强制执行CHECK约束。在您的特定情况下 - 相册的发布日期 - 您可以将CHECK约束替换为有效日期表的外键引用。另一方面,专辑的发行日期并不是,通常对人们至关重要,因此您可以捍卫简化数据库结构并允许偶尔发生错误日期的决定。

另一种替代方法是使用varchar(10)来存储字符串值,如'2010'和'2010-01-15'。 (像这样存储日期,并且它们将在没有类型转换的情况下正确排序。)并发症类似于使用多列(上面)。

对于专辑发布日期,我可能会使用varchar,并忽略坏数据的潜在问题,除非有一个特定于应用程序的,令人信服的理由来做更复杂的事情。

相关问题