扩展 Web 应用程序 - 包括用户和密码

Extending a Webapp - Include user and password

提问人:Madara's Ghost 提问时间:10/7/2011 最后编辑:Madara's Ghost 更新时间:10/17/2011 访问量:143

问:

在编写代码时,他们总是谈论可扩展性和灵活性,但在这里我想扩展我的 Web 应用程序,但我不知道该怎么做。


我有什么:

我有一个完整的网络应用程序,其工作方式类似于日历(尽管不完全是),学校有一份教师名单,每位教师都分配了许多测试,学校获得了可能的考试时间列表,并且必须使用几个规则将教师纳入可能的考试时间。完成了很多

我想做什么:

现在申请已经完成,我收到了支持用户/通行证系统的请求,每个用户都会有一个与他匹配的特定日历(在这种情况下是用户 == 学校)。

问题:

我想用最少的代码更改(对源类)进行转换。我可以扩展源类,但这意味着

  1. 将代码中引用类的所有时间更改为新名称
  2. 只需添加更多代码

关键是让每个用户都有自己的数据库。

我只想澄清一下,让用户通过登录系统不是问题,问题在于扩展代码以适应多用户环境


数据库结构:

固定表:

教师

id | name

月度表:

该程序每月更新一次,并且需要保存历史记录,因此这些表每月都会添加一次。

schedule_month_year - 实际计划。

id | datetime | teacherid

requests_month_year - 包含来自教师的请求(我想要在 dd/mm 上进行测试,或者我不想在 dd/mm 上进行测试)

id | teacherid | wantsornot

teachers_month_year - 包含有关教师的信息以及他们本月的测试次数。

teacherid | tests

我在这里寻找好的建议,也许我最初写的代码是错误的,在这种情况下,你如何编写代码来准备你不知道可能发生的事件?(我目前拥有的代码几乎已经从头开始重写,因为我被要求添加一个太大而无法容纳的更改)。

PHP OOP 编码风格

评论

0赞 Madara's Ghost 10/7/2011
我知道我也不喜欢它,但我不想使用 HEADERS(SEO 问题),所以我用了最可怕的方式来吸引注意力:X
0赞 Franziskus Karsunke 10/7/2011
这是个好问题。我认为,如果你能发布你的架构或数据库结构的图表,那会更容易帮助你。据我所知,没有通用的方法可以做到这一点。

答:

1赞 Maxem 10/7/2011 #1

关键是让每个用户都有自己的数据库。

如果每所学校都在自己的数据库中,为什么需要更改任何代码?

无论如何,您在这里看到的是一个典型的多租户应用程序。通常的方法是将租户标识符(在您的例子中为学校)添加到或多或少的每个表(类)中,并始终按此租户标识符进行筛选。

评论

0赞 Madara's Ghost 10/7/2011
我没有每所学校都有自己的数据库,我希望它:)我虽然是这样,但这也需要改变所有查询,这是相当多的。
0赞 Franziskus Karsunke 10/8/2011 #2

您必须添加一个表,其中每个教师属于一所学校,另一个表,其中每个用户属于一所学校。用户登录后,您将获得用户 ID,使用用户 ID 即可获得学校,使用学校即可获得所需的教师。现在,您只需将这些教师传递给 Web 应用程序。如果你提前做对了所有事情,你应该有一些模板,你用老师和时间表内容填写。不仅用用户的内容填充这些模板。

这样,您就不需要为每个用户使用一个数据库。

评论

0赞 Madara's Ghost 10/8/2011
那么时间表本身呢?这是一个完整的日期时间和教师 ID 列表,它定义了哪个老师有什么测试,如何将其合并到一个数据库中?
0赞 Franziskus Karsunke 10/8/2011
您只需将计划数据库中的教师 ID 与学校中的教师 ID 联接,然后将学校 ID 与用户联接即可。然后可以保证每个用户都看不到学校以外的时间表。
1赞 Paul 10/16/2011 #3
  1. 有 n + 1 个数据库。(1 用于将用户映射到学校和 其余的给学校)。
  2. 在代码中创建一个数据库选择类。
  3. 在用户登录之前,请使用映射数据库。
  4. 当用户登录时,检索其学校并将其存储在会话中。
  5. 设置会话时,使数据库选择类使用正确的数据库。

评论

0赞 XzKto 10/18/2011
+1,如果我的时间有限,我会以同样的方式做,但我认为你的描述使这个简单的解决方案听起来很困难:“数据库选择类”、“映射数据库”——真的吗?对不起,妈妈,只有我。
1赞 Herbert 10/17/2011 #4

有时我会觉得可扩展性是一个被炒作的流行语。事实并非如此。它确实有优点。但是,许多人吹捧可扩展性的好处给人的印象是,您几乎无需任何工作即可扩展应用程序。这种错觉在数据库交互面前会分崩离析,因为对数据库结构的更改/添加总是需要对代码进行更改。可扩展软件背后的真相是,它不容易扩展;相反,它比替代方案更容易

在这种特殊情况下,Maxem的想法是正确的。它“需要更改所有查询,这是相当多的”这一事实是无关紧要的。由于您有一个工作应用程序,因此额外的工作只需要扩展它所需的那些东西,而不是完全重写/重新设计。如果您所要做的只是添加一些数据库并更改一些查询,那么您就处于有利位置。

你如何编写代码,为你不知道的事件做准备 发生?

设计原则和模式试图回答这个问题。

您还可以从敏捷软件开发中受益,该软件开发解决了需求变化等问题。

我相信经验在这里也起着至关重要的作用。将来,当你设计一个面向单个用户的应用程序时,你会本能地开始考虑如何将其扩展到多个用户,并相应地设计应用程序。请理解,我并不是说你没有经验。我的观点是,每一次新的体验都会增加你的技术库。

评论

0赞 Madara's Ghost 10/19/2011
到目前为止最好的答案。我会再等一两天才能看到进一步的答案,如果没有人回答得更好,我会接受你的答案。
0赞 Herbert 10/20/2011
谢谢你的战利品(呃...... 呃......赏金)@Truth。我想不出任何可以改善我的答案的东西,尽管我对建议持开放态度。你的问题给了我一个咆哮的借口。;-)