從我假設電視節目指南存儲的數據類型來看,它確實看起來好像可以將所有內容存儲在關係數據庫中。我認爲使用filestsytem或XML文件沒有什麼優勢。
時間跟蹤查詢在SQL中應該非常簡單。
你可以如以下(在本例中使用MySQL)在考慮使用模式:
CREATE TABLE shows (
show_id int NOT NULL PRIMARY KEY,
name varchar(100),
description text
) ENGINE=InnoDB;
CREATE TABLE channels (
channel_id int NOT NULL PRIMARY KEY,
name varchar(100)
) ENGINE=InnoDB;
CREATE TABLE channel_slots (
slot_id int NOT NULL PRIMARY KEY,
channel_id int NOT NULL,
day date NOT NULL,
show_id int NOT NULL,
start datetime,
end datetime,
FOREIGN KEY (channel_id) REFERENCES channels(channel_id),
FOREIGN KEY (show_id) REFERENCES shows(show_id)
) ENGINE=InnoDB;
的shows
表應該定義每一個節目。 show_id
是一個surrogate key,你甚至可以讓它generate a unique serial number automatically。 name
字段只是名稱字段,description
字段有一個text
數據類型,可以存儲可變數量的文本。
channels
表應該非常簡單。我們再次使用代理鍵作爲channel_id
。我不確定頻道是否有一些可用作natural key的獨特標準代碼,但您應該使用代理鍵保證安全。
然後channel_slots
表爲每個頻道的每一天分配顯示位置。
我可能是錯的,但我認爲大多數電視節目指南並沒有嚴格定義一天的開始和結束在午夜。有時候一天可能會在第二天的凌晨2點,而一個從凌晨1點30分開始到凌晨2點結束的節目將成爲當天的一部分。如果是這種情況,這就是在此表中使用day
字段的原因。在這個領域,我們可以根據「節目指南日」來定義本節目屬於哪一天。
的slot_id
又是一個代理鍵,channel_id
和show_id
字段foreign keys到的相關表格。 start
和end
字段只是定義節目的準確開始和結束時間。如果您要插入節目時間尚未定義的節目,則可能需要在這些字段中插入NULL
。另一種選擇可以是使用另一個字段作爲標誌來標記是否確認放映時間。
如果您打算使用MySQL作爲您的DBMS,請注意InnoDB存儲引擎支持外鍵約束,而默認MyISAM引擎不支持。但是,只有MyISAM引擎支持full text indexing。如果您打算允許用戶搜索節目說明中的文字,這可能很有用。
給你上面的架構的例子,讓我們填充它的一些數據:
INSERT INTO shows VALUES (1, 'Breakfast Show', 'The everyday morning show');
INSERT INTO shows VALUES (2, 'Who wants to be a Millionaire?', 'Who does not?');
INSERT INTO shows VALUES (3, 'Saturday Night Live', 'Only on Saturdays');
INSERT INTO channels VALUES (1, 'Channel 1');
INSERT INTO channel_slots VALUES(
1, 1, '2010-07-17', 1, '2010-07-17 07:00:00', '2010-07-17 09:00:00');
INSERT INTO channel_slots VALUES(
2, 1, '2010-07-17', 2, '2010-07-17 18:00:00', '2010-07-17 19:00:00');
INSERT INTO channel_slots VALUES(
3, 1, '2010-07-17', 3, '2010-07-17 23:30:00', '2010-07-18 01:00:00');
這是我們的表怎麼看起來像現在:
mysql> SELECT * FROM channels;
+------------+-----------+
| channel_id | name |
+------------+-----------+
| 1 | Channel 1 |
+------------+-----------+
1 row in set (0.00 sec)
mysql> SELECT * FROM shows;
+---------+--------------------------------+---------------------------+
| show_id | name | description |
+---------+--------------------------------+---------------------------+
| 1 | Breakfast Show | The everyday morning show |
| 2 | Who wants to be a Millionaire? | Who does not? |
| 3 | Saturday Night Live | Only on Saturdays |
+---------+--------------------------------+---------------------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM channel_slots;
+---------+------------+------------+---------+---------------------+---------------------+
| slot_id | channel_id | day | show_id | start | end |
+---------+------------+------------+---------+---------------------+---------------------+
| 1 | 1 | 2010-07-17 | 1 | 2010-07-17 07:00:00 | 2010-07-17 09:00:00 |
| 2 | 1 | 2010-07-17 | 2 | 2010-07-17 18:00:00 | 2010-07-17 19:00:00 |
| 3 | 1 | 2010-07-17 | 3 | 2010-07-17 23:30:00 | 2010-07-18 01:00:00 |
+---------+------------+------------+---------+---------------------+---------------------+
3 rows in set (0.00 sec)
現在我們說的時候現在是2010-07-17 17:45:00
,你要顯示的是通道1的下一個節目:
SELECT s.name, cs.start, cs.end
FROM channel_slots cs
JOIN shows s ON (s.show_id = cs.show_id)
WHERE cs.start > NOW()
ORDER BY cs.start
LIMIT 1;
結果:
+--------------------------------+---------------------+---------------------+
| name | start | end |
+--------------------------------+---------------------+---------------------+
| Who wants to be a Millionaire? | 2010-07-17 18:00:00 | 2010-07-17 19:00:00 |
+--------------------------------+---------------------+---------------------+
1 row in set (0.00 sec)
那麼下面的查詢顯示當天的日程安排剩餘通道1:
SELECT s.name, cs.start, cs.end
FROM channel_slots cs
JOIN shows s ON (s.show_id = cs.show_id)
WHERE cs.start > NOW() AND
cs.day = '2010-07-17'
ORDER BY cs.start;
結果:
+--------------------------------+---------------------+---------------------+
| name | start | end |
+--------------------------------+---------------------+---------------------+
| Who wants to be a Millionaire? | 2010-07-17 18:00:00 | 2010-07-17 19:00:00 |
| Saturday Night Live | 2010-07-17 23:30:00 | 2010-07-18 01:00:00 |
+--------------------------------+---------------------+---------------------+
2 rows in set (0.00 sec)
等。我希望這能讓你朝着正確的方向前進。您還應該確保對database indexes進行研究,這是我的答案中未涉及的一個重要主題。
爲什麼你想在xml文件中存儲任何東西? 一個不錯的視頻,我今天發現有關此主題:http://vimeo.com/10506751 – antpaw 2010-07-18 22:01:56
因爲xml的酷炫因素,可能 – mvds 2010-07-18 22:10:11