Php Web应用程序体系结构设计

Php Web应用程序体系结构设计,php,javascript,architecture,web-applications,Php,Javascript,Architecture,Web Applications,我正在启动一个新项目,试图为电视电子节目指南创建一个web应用程序。这不是一个大规模的项目,而是我可以用来学习web应用程序编程的东西。我将使用PHP来实现这一点 在开始为应用程序编码之前,有一个关键问题困扰着我。由于应用程序需要大量使用数据库和/或XML文件进行数据存储,因此我对如何实现应用程序的体系结构感到困惑。对于这个初学者的问题,请耐心听我说 我应该如何实现应用程序的体系结构 例如,将有大约50个频道(50*N)个节目。我想的是: 将显示说明放入XML文件中 将通道名称放入数据库的表中

我正在启动一个新项目,试图为电视电子节目指南创建一个web应用程序。这不是一个大规模的项目,而是我可以用来学习web应用程序编程的东西。我将使用PHP来实现这一点

在开始为应用程序编码之前,有一个关键问题困扰着我。由于应用程序需要大量使用数据库和/或XML文件进行数据存储,因此我对如何实现应用程序的体系结构感到困惑。对于这个初学者的问题,请耐心听我说

我应该如何实现应用程序的体系结构

例如,将有大约50个频道(50*N)个节目。我想的是:

  • 将显示说明放入XML文件中
  • 将通道名称放入数据库的表中
  • 将show名称和id放在另一个表中,并从XML文档中获取show描述
上述架构缺少的是如何实际实现时间跟踪。我的意思是,我知道某个特定节目的开始和结束时间,但我在哪里“最好”存储这些信息?在数据库中还是在XML文件中?如何“最佳”显示信息


您有比上述体系结构更好的建议吗?

从我假设的电视节目指南存储的数据类型来看,它看起来确实可以将所有内容存储在关系数据库中。我看不出使用filestsystem或XML文件有什么好处

在SQL中,时间跟踪的查询应该非常简单

你可以考虑使用一个模式,比如下面的例子(在这个例子中使用MySQL):

shows
表应定义每个show
show_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应用程序-专注于技术自学)
首先,按优先顺序对其进行排序。如果这只是为了学习PHP,那么它是否是一个好的“电视网络应用程序”(短期内)其实并不重要

如果业务方面很重要(出于任何原因),那么您需要对其进行适当的研究,在这种情况下,我首先要考虑数据是如何连接在一起的。在纸上画一些简单的概念模型,把它们钉在你工作的墙上(或者,在白板上画,拍一张照片(比如用手机),然后打印一份)

您将拥有相关的实体(频道、节目、时间)。 整理好高层之后,从较低的层开始工作——可能是在纸上设计数据库表

这是架构与编程的较量;如果是我,我会将所有数据放在一个后端系统中(比如关系数据库),因为所有数据都是相关的,所以最好将它们放在同一个位置:

  • 您只需要开发一个DAL(数据访问层)
  • 你可以问各种相关实体的问题(在下午2-5点之间为所有频道提供所有节目)
或者,如果这是一个学习技术技能的练习,我可以理解为什么您希望在这里使用XML,在这里使用DB,因为它可以为您提供更广泛的学习内容

在这里,架构可以帮助您(这是另一个例子)