2010-07-18 7 views
2

TV 용 전자 프로그램 가이드 용 웹 응용 프로그램을 만들려고 새 프로젝트를 시작합니다. 이것은 대규모 프로젝트는 아니지만 웹 애플리케이션 프로그래밍을 배우기 위해 사용할 수있는 것입니다. 나는 이것을 위해 PHP를 사용하려고합니다.웹 응용 프로그램 아키텍처 디자인

응용 프로그램의 코딩을 시작하기 전에 나를 괴롭히는 중요한 질문이 있습니다. 응용 프로그램은 데이터 저장을 위해 데이터베이스 및/또는 XML 파일을 많이 사용해야하므로 응용 프로그램의 아키텍처를 구현하는 방법이 혼란 스럽습니다. 이 초급 질문에 대해서는 나와 함께 견뎌주십시오.

응용 프로그램의 아키텍처를 어떻게 구현해야합니까?

예를 들어, (50 * N) 개의 쇼가있는 약 50 개의 채널이있을 것입니다. 내가 생각하는 것은 :

  • XML 파일에 쇼 설명을 넣으십시오.
  • 채널 이름을 데이터베이스의 테이블에 넣습니다.
  • show 이름과 ID를 다른 테이블에 넣고 XML 문서의 show description을 가져옵니다.

위의 아키텍처가 부족한 점은 실제로 시간 추적을 구현하는 방법입니다. 특정 쇼가 시작되고 끝나는 시점을 알지만 그 정보를 "최상"에 저장하는 위치는 무엇입니까? 데이터베이스 또는 XML 파일에서? 그리고 정보를 "최상으로"표시하려면 어떻게해야합니까?

위 아키텍처보다 더 좋은 제안이 있습니까?

+0

왜 XML 파일에 무엇을 저장 하시겠습니까? 오늘 멋진 주제가 발견되었습니다. http://vimeo.com/10506751 – antpaw

+0

xml의 냉해 요인으로 인해 아마도 – mvds

답변

6

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_idsurrogate 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_idshow_id 필드는 관련 테이블에 foreign keys입니다. startend 필드는 단순히 쇼의 정확한 시작 및 종료 시간을 정의합니다. 쇼 시간이 아직 정의되지 않은 쇼를 삽입하려는 경우이 필드에 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에 대해 조사해야합니다. 염두에 두어야 할 생각 "스트림"의 몇 가지가있다

+0

사실, 관련 데이터를 가져 오는 데 스트레스가 걱정되는 유일한 이유는 이 경우 데이터베이스 정보에서 작성된보다 복잡한 객체를 memcache 또는 apc와 같은 것으로 캐시하십시오. – Wrikken

0

:

  • "비즈니스 문제"(멋진 TV 웹 응용 프로그램을 만드는 방법 - 비즈니스 가치에 초점을 맞춘)
  • " 아키텍처 문제 "- 앱/차가운 기술을 구조화하는 방법.
  • "프로그래밍 문제"- 쓰기/사용할 기술을 익히는 코드. (멋진 웹 앱을 만드는 법 - 기술자가 학습에 중점을 둠)

우선 순위에 따라 우선 순위를 지정하십시오. 이것이 PHP에 대한 이야기 ​​일 뿐이라면 좋은 "TV 웹 앱"인지 아닌지에 대해 (단기간에)별로 중요하지 않습니다.

비즈니스 측면이 중요한 경우 (이유가 무엇이든간에) 당연한 상상을 할 필요가 있습니다.이 경우 데이터가 어떻게 끊어 지는지 생각해 보는 것이 좋습니다. 몇 가지 간단한 개념 모델을 종이에 그려 벽에 고정하십시오 (또는 화이트 보드에서 사진을 찍고 전화로 말하고 복사본을 인쇄하십시오).

관련 항목 (채널, 쇼, 시간)이 있습니다. 높은 수준을 정렬했으면 종이에 데이터베이스 테이블을 디자인하여 낮은 수준에서 작업을 시작하십시오.

이것은 아키텍처 대 프로그래밍이 등장합니다. 그것은 나를라면 내가 한 백엔드 시스템의 모든 데이터를 다루고 싶어요 - 말 관계형 데이터베이스를 - 모든 데이터가 관련되어 있기 때문에 같은 장소에 모두 보관하는 것이 좋습니다 :

  • 만 필요
  • 여러 관련 단체에 걸쳐 질문 할 수 있습니다 (모든 채널에 대해 2 ~ 5pm 사이에 모든 프로그램을 가져와).

또한 기술적 인 기술을 배우는 연습 인 경우 여기에서 XML과 여기에 DB가 필요한 이유를 알 수 있습니다. 학습 할 수있는 범위가 넓기 때문입니다.

아키텍처가 당신을 도울 수 있습니다 (또 다른 훌륭한 기술을 배울 수 있습니다). 그것이 나 였다면 (그리고 내가 .Net에서 이것을하고 있었다) 인터페이스 뒤에 모든 데이터 액세스를 추상화 했으니 까. 내가 원하는만큼 많은 다른 DAL을 가질 수 있었다. 살펴보기 Dependency Inversion Principle

관련 문제