Php Web应用程序体系结构设计
我正在启动一个新项目,试图为电视电子节目指南创建一个web应用程序。这不是一个大规模的项目,而是我可以用来学习web应用程序编程的东西。我将使用PHP来实现这一点 在开始为应用程序编码之前,有一个关键问题困扰着我。由于应用程序需要大量使用数据库和/或XML文件进行数据存储,因此我对如何实现应用程序的体系结构感到困惑。对于这个初学者的问题,请耐心听我说 我应该如何实现应用程序的体系结构 例如,将有大约50个频道(50*N)个节目。我想的是:Php Web应用程序体系结构设计,php,javascript,architecture,web-applications,Php,Javascript,Architecture,Web Applications,我正在启动一个新项目,试图为电视电子节目指南创建一个web应用程序。这不是一个大规模的项目,而是我可以用来学习web应用程序编程的东西。我将使用PHP来实现这一点 在开始为应用程序编码之前,有一个关键问题困扰着我。由于应用程序需要大量使用数据库和/或XML文件进行数据存储,因此我对如何实现应用程序的体系结构感到困惑。对于这个初学者的问题,请耐心听我说 我应该如何实现应用程序的体系结构 例如,将有大约50个频道(50*N)个节目。我想的是: 将显示说明放入XML文件中 将通道名称放入数据库的表中
- 将显示说明放入XML文件中李>
- 将通道名称放入数据库的表中李>
- 将show名称和id放在另一个表中,并从XML文档中获取show描述李>
您有比上述体系结构更好的建议吗?从我假设的电视节目指南存储的数据类型来看,它看起来确实可以将所有内容存储在关系数据库中。我看不出使用filestsystem或XML文件有什么好处 在SQL中,时间跟踪的查询应该非常简单
你可以考虑使用一个模式,比如下面的例子(在这个例子中使用MySQL):
shows
表应定义每个showshow_id
是一个,你甚至可以做到。name
字段只是名称字段,而description
字段有一个数据类型,可以存储可变数量的文本
频道
表应该非常简单。我们再次使用代理键作为通道id
。我不确定频道是否有一些唯一的标准代码可以用作代理密钥,但使用代理密钥应该是安全的
然后,channel\u slots
表将show slots分配给每个频道的每一天
我可能错了,但我认为大多数电视节目指南并没有严格地将一天定义为午夜开始和结束。有时一天可能在第二天凌晨2:00开始,从凌晨1:30开始到凌晨2:00结束的节目将成为当天的一部分。如果是这种情况,这就是在该表中使用day
字段的原因。在这个领域,我们可以用“节目指南日”来定义该节目所属的日期
slot\u id
又是一个代理键,channel\u id
和show\u id
字段被添加到相关表中。start
和end
字段仅定义演出的准确开始和结束时间。如果要在尚未定义放映时间的地方插入放映,则可能需要在这些字段中插入NULL
。另一种选择是使用另一个字段作为标记,以标记是否确认显示时间
如果要使用MySQL作为DBMS,请注意存储引擎支持外键约束,而默认引擎不支持。但是,只有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 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;
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 |
+--------------------------------+---------------------+---------------------+
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()
ORDER BY cs.start
LIMIT 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)
等等。我希望这能让你走上正确的方向。你还应该确保对我的回答中没有涉及的一个重要主题进行研究。你需要记住两条“思路”:
- “商业问题”(如何制作一款酷炫的电视网络应用程序-关注商业价值)
- “架构问题”-如何构建应用程序/酷技术
- “编程问题”-编写哪些代码/使用哪些技术。(如何制作酷的web应用程序-专注于技术自学)
- 您只需要开发一个DAL(数据访问层)
- 你可以问各种相关实体的问题(在下午2-5点之间为所有频道提供所有节目)