提问人:Madara's Ghost 提问时间:10/7/2011 最后编辑:Madara's Ghost 更新时间:10/17/2011 访问量:143
扩展 Web 应用程序 - 包括用户和密码
Extending a Webapp - Include user and password
问:
在编写代码时,他们总是谈论可扩展性和灵活性,但在这里我想扩展我的 Web 应用程序,但我不知道该怎么做。
我有什么:
我有一个完整的网络应用程序,其工作方式类似于日历(尽管不完全是),学校有一份教师名单,每位教师都分配了许多测试,学校获得了可能的考试时间列表,并且必须使用几个规则将教师纳入可能的考试时间。完成了很多
我想做什么:
现在申请已经完成,我收到了支持用户/通行证系统的请求,每个用户都会有一个与他匹配的特定日历(在这种情况下是用户 == 学校)。
问题:
我想用最少的代码更改(对源类)进行转换。我可以扩展源类,但这意味着
- 将代码中引用类的所有时间更改为新名称
- 只需添加更多代码
关键是让每个用户都有自己的数据库。
我只想澄清一下,让用户通过登录系统不是问题,问题在于扩展代码以适应多用户环境
数据库结构:
固定表:
教师
id | name
月度表:
该程序每月更新一次,并且需要保存历史记录,因此这些表每月都会添加一次。
schedule_month_year - 实际计划。
id | datetime | teacherid
requests_month_year - 包含来自教师的请求(我想要在 dd/mm 上进行测试,或者我不想在 dd/mm 上进行测试)
id | teacherid | wantsornot
teachers_month_year - 包含有关教师的信息以及他们本月的测试次数。
teacherid | tests
我在这里寻找好的建议,也许我最初写的代码是错误的,在这种情况下,你如何编写代码来准备你不知道可能发生的事件?(我目前拥有的代码几乎已经从头开始重写,因为我被要求添加一个太大而无法容纳的更改)。
答:
关键是让每个用户都有自己的数据库。
如果每所学校都在自己的数据库中,为什么需要更改任何代码?
无论如何,您在这里看到的是一个典型的多租户应用程序。通常的方法是将租户标识符(在您的例子中为学校)添加到或多或少的每个表(类)中,并始终按此租户标识符进行筛选。
评论
您必须添加一个表,其中每个教师属于一所学校,另一个表,其中每个用户属于一所学校。用户登录后,您将获得用户 ID,使用用户 ID 即可获得学校,使用学校即可获得所需的教师。现在,您只需将这些教师传递给 Web 应用程序。如果你提前做对了所有事情,你应该有一些模板,你用老师和时间表内容填写。不仅用用户的内容填充这些模板。
这样,您就不需要为每个用户使用一个数据库。
评论
- 有 n + 1 个数据库。(1 用于将用户映射到学校和 其余的给学校)。
- 在代码中创建一个数据库选择类。
- 在用户登录之前,请使用映射数据库。
- 当用户登录时,检索其学校并将其存储在会话中。
- 设置会话时,使数据库选择类使用正确的数据库。
评论
有时我会觉得可扩展性是一个被炒作的流行语。事实并非如此。它确实有优点。但是,许多人吹捧可扩展性的好处给人的印象是,您几乎无需任何工作即可扩展应用程序。这种错觉在数据库交互面前会分崩离析,因为对数据库结构的更改/添加总是需要对代码进行更改。可扩展软件背后的真相是,它不容易扩展;相反,它比替代方案更容易。
在这种特殊情况下,Maxem的想法是正确的。它“需要更改所有查询,这是相当多的”这一事实是无关紧要的。由于您有一个工作应用程序,因此额外的工作只需要扩展它所需的那些东西,而不是完全重写/重新设计。如果您所要做的只是添加一些数据库并更改一些查询,那么您就处于有利位置。
你如何编写代码,为你不知道的事件做准备 发生?
设计原则和模式试图回答这个问题。
您还可以从敏捷软件开发中受益,该软件开发解决了需求变化等问题。
我相信经验在这里也起着至关重要的作用。将来,当你设计一个面向单个用户的应用程序时,你会本能地开始考虑如何将其扩展到多个用户,并相应地设计应用程序。请理解,我并不是说你没有经验。我的观点是,每一次新的体验都会增加你的技术库。
评论