|
27
|
| Mike Spross Alex Martelli · 技术社区 · 17 年前 |
|
|
1
17
我将避免使用字符串选项来表达纯洁感:它添加了一个您不需要的额外编码/解码层。在国际化的情况下,它也可能会把你搞得一团糟。 因为一周的天数是7,所以我会保留7列,也许是布尔值。这也将有助于后续查询。如果在工作周从不同的日期开始的国家使用该工具,这也将非常有用。 我将避免查找,因为这将过度规范化。除非您的一组查找项不明显或可能发生更改,否则这是多余的。以一周中的几天为例(例如,与美国不同),我会在固定的环境下睡得很好。 考虑到数据域,我认为位域不会为您节省大量的空间,只会使代码更加复杂。 最后,一句关于这个领域的警告:很多学校在他们的日程表上做一些奇怪的事情,在这些日程表中,尽管假期,他们“交换天数”来平衡每种类型的工作日数量。我不清楚您的系统,但最好的方法可能是存储一个实际日期表,在其中课程预计发生。这样,如果一个星期有两个星期二,老师两次出现就可以得到报酬,而被取消的星期四的老师将不会得到报酬。 |
|
2
17
我认为如果我们使用位选项,就不难编写查询。只需使用简单的二进制数学。我认为这是最有效的方法。就我个人而言,我总是这样做。看一看:
现在,假设课程在周一、周三和周五举行。要保存在数据库中的值为42(2+8+32)。然后您可以在星期三这样选择课程:
如果你想上周四和周五的课程,你可以写:
这篇文章是相关的: http://en.wikipedia.org/wiki/Bitwise_operation 您可以将星期几作为常量放在代码中,这样就足够清楚了。 希望它有帮助。 |
|
|
3
7
一个可能的4:为什么它需要是一个单独的列?您可以将一周中的每一天的7位列添加到表中。用它编写SQL很简单,只需在您选择的列中测试1即可。从数据库中读取的应用程序代码只是将其隐藏在一个开关中。我意识到这不是正常的形式,我通常会花相当多的时间尝试从以前的程序员那里撤销这种设计,但我有点怀疑我们是否会在不久的将来给这周增加第八天。 为了对其他解决方案发表评论,如果遇到查找表,我可能会呻吟。我的第一个倾向是位字段和一些自定义数据库函数,以帮助您轻松地针对该字段编写自然查询。 我很想看看人们提出的其他一些建议。 编辑:我应该添加3,上面的建议更容易添加索引。我不知道如何为不会导致表扫描的1或2查询编写类似“在星期四获取所有类”的SQL查询。但今晚我可能只是昏昏欲睡。 |
|
4
4
3号解决方案似乎最接近我的建议。查找表概念的扩展。每门课程都有一个或多个课程。创建具有以下属性的会话表:课程ID、日期、时间、讲师ID、房间ID等。 现在,您可以为每门课程的每一节课分配不同的讲师或房间,假设您以后可能希望存储这些数据。 如果您正在考虑最佳的数据库设计,那么用户界面问题就不相关。您可以始终创建用于显示数据的视图,对于捕获数据,您的应用程序可以处理为每个课程捕获多个会话并将它们添加到数据库的逻辑。 这些表的含义会更清楚,这使得长期维护更容易。 |
|
|
5
3
如果选择一个或两个,则表将不为1nf(第一个正常形式),因为它包含多值列。 尼古拉斯有一个很好的想法,尽管我不同意他的想法打破了最初的正常形式:数据实际上不是重复的,因为每天都是独立存储的。 唯一的问题是您必须检索更多的列。 |
|
|
6
1
如果性能是一个问题,我建议更清洁的变量为3。 将课程链接到“日程”表。 它依次链接到“日程”表中的“天”。 _schedule表中的days_列包含日程名称和_schedule_day中的日期。该计划中的每个有效日期都有一行。 你需要一些时间来操作一些聪明的程序来填充这个表,但是一旦完成了这个操作, 灵活性是值得的。 您不仅可以应付“仅星期五的课程”,还可以应付“仅第一学期”、“第三学期实验室关闭整修”和“加拿大分公司假期安排不同”。 其他可能的查询是“从4月1日开始的20天课程的结束日期是什么”,“日程冲突最严重”。 如果你真的很擅长SQL,你可以问“对于一个已经预订了YYY课程的学生,XXX课程可能会有几天时间开放”——我觉得这是你所提议的系统的真正产物。 |
|
|
developer · 带外键的SQL表设计 1 年前 |
|
|
relatively_random · 确保两个表之间一致的共同参考 1 年前 |
|
|
b126 · 在两种不同的Oracle模式上执行相同查询的速度差异很大 2 年前 |
|
|
robertspierre · 在多对多关系中自动删除未引用的行 2 年前 |
|
|
Michael Samuel · MYSQL在以下情况下自动创建索引 8 年前 |