Разработка архитектуры веб-приложения - PullRequest
2 голосов
/ 19 июля 2010

Я начинаю новый проект, пытаясь создать веб-приложение для электронного гида программ для телевидения.Это не будет крупномасштабный проект, а просто то, что я могу использовать для изучения программирования веб-приложений.Я собираюсь использовать PHP для этого.

Перед тем, как приступить к написанию кода для приложения, есть важный вопрос, который меня беспокоит.Поскольку приложение предполагает широкое использование базы данных и / или файлов XML для хранения данных, я не совсем понимаю, как реализовать архитектуру приложения.Пожалуйста, терпите меня за этот вопрос для начинающих.

Как мне реализовать архитектуру приложения?

Например, будет около 50 каналов с (50 * N) количеством шоу.Я думаю следующее:

  • Поместить описание шоу в файл XML.
  • Поместить названия каналов в таблицу в базе данных.
  • Поместите имена шоу и идентификаторы в другие таблицы и извлеките описание шоу из документа XML.

Чего не хватает вышеупомянутой архитектуре, так это того, как реально реализовать отслеживание времени.Я имею в виду, я знаю, когда начинается и заканчивается какое-то конкретное шоу, но где мне лучше всего хранить эту информацию?В базе данных или в файле XML?И как мне «лучше» отобразить информацию?

У вас есть предложение лучше, чем приведенная выше архитектура?

Ответы [ 2 ]

6 голосов
/ 19 июля 2010

Из тех данных, которые, как я предполагаю, хранятся в руководствах по телепрограммам, похоже, что вы можете хранить все внутри реляционной базы данных.Я не вижу никаких преимуществ в использовании файловых систем или файлов 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 - это суррогатный ключ , и вы даже можете сделать так, чтобы автоматически генерировал уникальный серийный номер .Поле name является просто полем имени, а поле description имеет тип данных text, который может хранить переменное количество текста.

Таблица channels должнабыть довольно простым.Мы снова используем суррогатный ключ как channel_id.Я не уверен, что у каналов есть какой-то уникальный стандартный код, который можно использовать вместо естественного ключа 1024 *, но вы должны быть в безопасности с суррогатным ключом.

Тогда таблица channel_slotsвыделяет шоу-слоты каждому дню каждого канала.

Я могу ошибаться, но я думаю, что большинство телепрограмм не определяют день как начало и конец в полночь.Иногда день может быть в 2:00 утра следующего дня, и программа, начинающаяся в 1.30 и заканчивающаяся в 2.00, станет частью этого дня.Если это так, то причина использования поля day в этой таблице.В этом поле мы можем определить день, к которому принадлежит это шоу, в терминах «дней руководства по программе».

slot_id снова является суррогатным ключом, а поля channel_id и show_id представляют собой внешние ключи для соответствующей таблицы.Поля start и end просто определяют точное время начала и окончания шоу.Если вы будете вставлять шоу, где время пока еще не определено, вы можете вставить NULL в эти поля.Другим вариантом может быть использование другого поля в качестве флага для отметки, если подтверждено, что время показа не подтверждено.

Если вы собираетесь использовать MySQL в качестве СУБД, обратите внимание, что механизм хранения InnoDB поддерживает ограничения по внешнему ключу, в то время как механизм по умолчанию MyISAM не поддерживает.Однако только механизм MyISAM поддерживает полнотекстовое индексирование .Это может быть полезно, если вы хотите разрешить своим пользователям искать текст внутри описания шоу.

Чтобы дать вам пример вышеуказанной схемы, давайте заполним некоторые данные в ней:

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)

И так далее.Я надеюсь, что это приведет вас в правильном направлении.Вы также должны изучить индексы базы данных , важную тему, не затронутую в моем ответе.

0 голосов
/ 19 июля 2010

Есть пара «потоков» мыслей, о которых вам нужно помнить:

  • «Бизнес-проблемы» (как создать крутое телевизионное веб-приложение, ориентированное на бизнес-ценность)
  • «Проблемы архитектуры» - как структурировать приложение / классные технологии.
  • «Проблемы программирования» - какой код писать / использовать классные технологии.(как создать классное веб-приложение, ориентированное на техническое самообучение)

Сначала оцените их в порядке приоритета.Если речь идет только об использовании PHP, то на самом деле не имеет большого значения (в краткосрочной перспективе) вопрос о том, является ли это хорошим «телевизионным веб-приложением» или нет.

Если важна деловая сторона (для любогопричина), тогда вам нужно проявить должную осмотрительность, и в этом случае я бы начал с того, что подумал о том, как данные соединяются вместе.Нарисуйте несколько простых концептуальных моделей на бумаге и прикрепите их на стене, где вы работаете (или, сделайте их на доске, сделайте их фотографию (скажем, с помощью телефона) и распечатайте копию).

У вас будут связанные сущности (каналы, шоу, время).Как только вы разберетесь с высоким уровнем, начните работать на более низком уровне - возможно, создавая таблицы базы данных на бумаге.

Это когда в игру вступает Архитектура против программирования ;если бы это был я, я бы поместил все данные в одну внутреннюю систему, скажем, в реляционную базу данных, потому что все данные связаны, поэтому лучше хранить их в одном месте:

  • ВыНужно только разработать один DAL (Уровень доступа к данным)
  • Вы можете задавать вопросы, которые охватывают различные связанные объекты (получите все шоу между 2 - 5 вечера для всех каналов).

В качестве альтернативыЕсли это упражнение - обучение техническим навыкам, я понимаю, почему вы хотите иметь XML здесь и БД здесь - потому что это дает вам больше возможностей для изучения.

Архитектура может помочьВы здесь (и это еще один большой навык, чтобы учиться).Если бы это был я (а я делал это в .Net), я бы абстрагировал весь доступ к данным через интерфейс (ы) - таким образом, я мог бы иметь столько разных физических DAL, сколько я хотел;взгляните на принцип обращения зависимостей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...