TV 프로그램 가이드가 저장하는 데이터의 종류에서 관계형 데이터베이스에 모든 것을 저장할 수있는 것처럼 보입니다. 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
테이블은 각 채널의 각 요일에 쇼 슬롯을 할당합니다.
나는 틀릴 수도 있지만 대부분의 TV 프로그램 가이드는 엄격하게 하루를 자정에 시작하고 끝내는 것으로 정의하지 않는다고 생각합니다. 때로는 그날이 다음날 오전 2시에있을 수도 있고 오전 1시 30 분에 시작하여 오전 2시에 끝나는 프로그램이 그 날의 일부가 될 수도 있습니다. 이 경우이 테이블에 day
필드를 사용하는 이유입니다. 이 필드에서 우리는이 쇼가 속한 날을 "프로그램 가이드의 날"로 정의 할 수 있습니다.
slot_id
은 다시 대용 키이고 channel_id
및 show_id
필드는 관련 테이블에 foreign keys입니다. start
및 end
필드는 단순히 쇼의 정확한 시작 및 종료 시간을 정의합니다. 쇼 시간이 아직 정의되지 않은 쇼를 삽입하려는 경우이 필드에 NULL
을 삽입 할 수 있습니다. 또 다른 옵션은 쇼 시간이 아닌지를 확인하는 플래그로 다른 필드를 사용하는 것입니다.
DBMS로 MySQL을 사용하려는 경우 InnoDB 스토리지 엔진은 외래 키 제약 조건을 지원하지만 기본값 인 MyISAM 엔진은 외래 키 제약 조건을 지원합니다. 그러나 MyISAM 엔진 만 full text indexing을 지원합니다. 사용자가 프로그램 설명에서 텍스트를 검색 할 수있게하려는 경우 유용 할 수 있습니다. 이제 시간 가정 해 봅시다 이제
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)
:
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');
이 우리 테이블이 지금처럼 보이게하는 방법입니다
은의 그것에서 일부 데이터를 채울 수 있도록, 당신에게 위의 스키마의 예를 제공합니다 지금은 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
xml의 냉해 요인으로 인해 아마도 – mvds