【问题标题】:How to structure some data in database for easy retrieval later如何在数据库中构造一些数据以便以后检索
【发布时间】:2009-09-06 01:47:24
【问题描述】:

我有一组复选框,管理员可以勾选这些复选框以授予用户权限。在我的例子中,管理员可以点击这些复选框:Image on ImageShack。这些复选框将允许用户查看这些国家/城市的数据。

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

我正在绞尽脑汁去做以下事情:

1) 如何最好地将此权限插入我的数据库 2) 以后如何计算出每个用户被允许的权限

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

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

【问题讨论】:

    标签: php mysql database


    【解决方案1】:

    您需要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)) {
        # ...
    

    【讨论】:

    【解决方案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;
    

    【讨论】:

      【解决方案3】:

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

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

      例如

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

      只要您在用户结构中有一个特定的变量,允许您在加载后跟踪权限(映射/关联数组对此很有用。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 2023-03-28
        • 2017-07-09
        相关资源
        最近更新 更多