我很難決定如何在我的相冊數據庫中存儲發佈日期。有些專輯有月份,日期和年份,但其他專輯只有一年。如果我想顯示這兩種格式,如何存儲這些發佈日期?我注意到allmusic.com這樣做。我的同事告訴我他認爲他們將月份,日期和年份存儲爲數據庫中的單獨字段,但我想這會使得按時間順序排列相冊變得困難。有關如何完成這些任務的任何建議?當某些記錄有月/日/年,而其他記錄只有一年時如何存儲日期?
我正在使用MySQL,但我問這是關於關係數據庫設計的一般問題。
我很難決定如何在我的相冊數據庫中存儲發佈日期。有些專輯有月份,日期和年份,但其他專輯只有一年。如果我想顯示這兩種格式,如何存儲這些發佈日期?我注意到allmusic.com這樣做。我的同事告訴我他認爲他們將月份,日期和年份存儲爲數據庫中的單獨字段,但我想這會使得按時間順序排列相冊變得困難。有關如何完成這些任務的任何建議?當某些記錄有月/日/年,而其他記錄只有一年時如何存儲日期?
我正在使用MySQL,但我問這是關於關係數據庫設計的一般問題。
我會使用DATE類型存儲日期並使用精確度列。
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 |
'2010-01-15'是日期。 '2010'不是。
有幾種方法來處理這樣的數據。使用單獨的年份,月份和日期列是一種選擇,但它有一些缺點。
一方面,保證組合值代表真實日期非常複雜,特別是使用MySQL。 MySQL不強制執行CHECK約束。在您的特定情況下 - 相冊的發佈日期 - 您可以將CHECK約束替換爲有效日期表的外鍵引用。另一方面,專輯的發行日期並不是,通常對人們至關重要,因此您可以捍衛簡化數據庫結構並允許偶爾發生錯誤日期的決定。
另一種替代方法是使用varchar(10)
來存儲字符串值,如'2010'和'2010-01-15'。 (像這樣存儲日期,並且它們將在沒有類型轉換的情況下正確排序。)併發症類似於使用多列(上面)。
對於專輯發佈日期,我可能會使用varchar,並忽略壞數據的潛在問題,除非有一個特定於應用程序的,令人信服的理由來做更復雜的事情。
您是否嘗試將此信息存儲爲varchar字段? – 2015-04-06 06:31:10
參見http://programmers.stackexchange.com/questions/194286/how-do-you-store-fuzzy-dates-into-a-database – 2015-04-06 19:08:31