在代码中引用MySQL表键的最佳方法

时间:2012-01-12 00:45:09

标签: php mysql

我不是一个专业的网络开发人员,但我在高中时涉足过php。我目前正在为我在大学里所属的一个组织更新网站。我真的没有简洁的方式来问我的问题,所以我举个例子:

对于我们组织中的办公室,表格如下:

officeid_officename
+------------+------------+
| officeid   | officename |
+------------+------------+
| 1          | president  |
| ...        | ...        |
+------------+------------+

officeid_memberid
+------------+----------+
| officeid   | memberid |
+------------+----------+
| 1          | 234      |
| ...        | ...      |
+------------+----------+

memberid_memberdata
+------------+------------+-----+
| memberid   | membername | ... |
+------------+------------+-----+
| ...        | ...        | ... |
| 234        | John Smith | ... |
| ...        | ...        | ... |
+------------+------------+-----+

据我所知,这将是一个适当的表格设计,因为它允许1)办公室名称被任意改变(例如,如果“总统”成为“至尊霸王”)2)它允许成员可以随意添加到办公室或从办公室中删除3)最终,每个成员的数据可以在没有成员与办公室的链接受到影响的情况下发生变化。

我遇到的问题是,在我写的代码中,我的授权取决于成员所在的办公室。我可以想出三个选项来表示允许哪些办公室执行哪些操作。

1)使用“President”等作为要检查的标识符(例如if($officename === "president") { ... do something ... }

  • 但是,这似乎打败了表格设计的目的,因为办公室名称的更改将破坏授权。

2)使用officeid作为标识符进行检查(例如if($officeid === 1) { ... do something ... }

  • 但是,这似乎缺乏可维护性,因为开发人员不得不引用数据库,以便在编辑当前代码或编写未来代码时查看id指的是哪个办公室。

3)在配置文件中定义常量PRESIDENT_CONSTANT = 1或类似内容,并检查常量(例如if($officeid === PRESIDENT_CONSTANT) { ... do something ... }

  • 然而a)这与(1)的共享问题在于,职位名称可能会改变b)这实际上是在配置文件中重新创建officeid_officename表

在这三个选项中,我觉得第二个是最正确的,但我对可维护性问题有着挥之不去的感觉。有没有更好的方法来完成我需要做的事情?

感谢。

2 个答案:

答案 0 :(得分:2)

第二是好的。然后你可以找到办公室里有这个sql的成员:

SELECT memberid FROM officeid_memeberid WHERE officeid = 1 AND  is_del = 0;

你也可以通过这个sql找到一个成员加入的办公室:

SELECT officeid FROM officeid_memeber_id WHERE memberid = 234 AND is_del = 0;

is_del字段用于在您想要从办公室删除成员或某个成员时进行更新:

INSERT INTO officeid_memberid (officeid,memberid,is_del) values (1,234,0);

并在删除时:

UPDATE officeid_memberid SET is_del = 1 WHERE memberid = 234 AND officeid = 1;

这样您就可以找到成员加入的办事处现在不在。

答案 1 :(得分:0)

是的,#2是正确的。

我不确定你为什么担心“经常需要引用数据库。”

假设您正在编写一个经典的PHP Web应用程序,每个页面加载从头开始执行您的脚本。如果您在开头检查办公室并存储结果,您可以通过每页加载一次查询来逃避。无论如何,数据库都针对查询进行了高度优化 - 其中一些数据库不会对您造成伤害。

上述模型的唯一缺点是您有潜在的竞争条件:如果数据库在单次执行期间更改,那么您将拥有一种特权提升漏洞。

要解决这个问题,一种方法是在开始时通过数据库进行身份验证(即检查办公室),缓存结果,然后运行代码并排队SQL事务中的任何数据库工作。然后在将页面发送给用户之前重新进行身份验证。如果身份验证失败,则会向用户发送错误并回滚事务。如果成功(即办公室与缓存结果匹配),则向用户发送页面内容并提交事务。

如果您不是专业的Web开发人员,可能需要考虑很多,但软件(即使是大学组织)也有办法在非预期的地方使用,所以最好在开始编写之前考虑安全性后果