如何在数据库中构造一些数据以便以后轻松检索

时间:2009-09-05 10:40:29

标签: php mysql database

我有一组复选框,管理员可以勾选这些复选框以向用户提供权限。在我的情况下,管理员可以点击这些复选框:Image on ImageShack。这些复选框将允许用户查看这些国家/城市的数据。

http://img205.imageshack.us/img205/4170/screenshotao.png

我正绞尽脑力做下面的事情:

1)如何最好地将此权限插入我的数据库 2)如何稍后确定允许每个用户的权限

目前,我正在考虑将每个复选框的大量列添加到我的数据库中并在其中放置1或0。然后使用大量if函数检查这些!这在编码时会浪费时间。

还有什么我可以做的吗?我感谢任何帮助!

3 个答案:

答案 0 :(得分:4)

您需要SET data type。 SET或多或少是bit field,其中每个位都有一个名称:

ALTER TABLE user ADD COLUMN permissions SET(
    'States',
    'Cities',
    'Africa',
    'Asia',
    'Australia',
    'Europe',
    ...
);

选择可以查看亚洲数据的用户:

SELECT * FROM user WHERE FIND_IN_SET('Asia',permissions) > 0;

或选择所有可以查看亚洲和欧洲而非非洲的用户:

SELECT * FROM user WHERE permissions & 40 = 40 AND !(permissions & 4)

我会在PHP中进一步定义这些常量,然后你的代码应该是可读的:

define('PERMISSION_STATES', 1);
define('PERMISSION_CITIES', 2);
define('PERMISSION_AFRICA', 4);
define('PERMISSION_ASIA', 8);
define('PERMISSION_AUSTRALIA', 16);
define('PERMISSION_EUROPE', 32);
# ...

# Check if user can view data for Africa
if ($user['permissions'] & PERMISSION_AFRICA) {
    # ...

# Check if user can Asia and Europe but not Africa
if ($user['permissions'] & PERMISSION_ASIA
    && $user['permissions'] & PERMISSION_EUROPE
    && !($user['permissions'] & PERMISSION_AFRICA)) {
    # ...

答案 1 :(得分:2)

我会使用规范化的数据库方法:用户与权限之间存在多对多关系。您需要一个交集表来存储此信息。

CREATE TABLE UserPermissions (
  user_id INT NOT NULL,
  perm_id INT NOT NULL,
  PRIMARY KEY(user_id, perm_id),
  FOREIGN KEY (user_id) REFERENCES Users (user_id),
  FOREIGN KEY (perm_id) REFERENCES Permissions (perm_id)
);

为用户输入权限时,请为每个权限输入一行:

INSERT INTO UserPermissions (user_id, perm_id) VALUES
 (1234, 1), -- for Cities
 (1234, 5), -- for continent North America
 (1234, 17); -- for country Canada

现在可以轻松查询所有拥有北美许可的用户:

SELECT Users.*
FROM Users JOIN UserPermissions USING (user_id)
WHERE perm_id = 5;

您还可以获取给定用户的逗号分隔权限列表:

SELECT user_id, GROUP_CONCAT(Permissions.Name) AS perm_list
FROM UserPermissions JOIN Permissions USING (perm_id)
WHERE user_id = 1234
GROUP BY user_id;

答案 2 :(得分:0)

您可以拥有一个权限表,其中包含用户名,然后是每个权限的列数。

这会阻止您使用所有这些数据填充您的用户表(因为您可能只需要有限的容量),但允许您查看每个权限并查看用户拥有的权限:

e.g

For Each Field
     User.Permission[Field] = Field
Next Field

只要你在User结构中有一个特定的变量,它允许你在加载后跟踪权限(地图/关联数组对此有好处。)