0

如果我的数据库表中有超过 20 个字段的表,可以吗?

ID | NAME | 1 | 2 | 3 | .....

像“2”这样的每个字段都只包含 Y 或 N。或者在一张表中有这样的字段是个坏主意?这会降低我的服务器性能吗?

并且表中可能有大约 20 个或更多的 Id。

4

3 回答 3

0

我不知道它是否会减慢数据库的速度,但它不是一个很好的数据库设计,不。您可以采取以下措施来优化设计:

制作一个表:ID | NAME和另一个表:ID | NUMBER | BOOLEAN并将两个 ID 链接在一起。

您可能会以这种方式编写更多 PHP 代码,但它会使数据库更易于管理和更整洁。

于 2012-08-26T10:40:20.157 回答
0

如果你做额外的桌子会更好

names

name_ID |   name
  1        george
  2        jenny

acl

acl_ID |   name_ID  |  page_ID | acccess
   1          1          1          Y
   2          1          2          N

pages

 page_ID | page_name
    1        Page1
    2        Page2

获得结果非常容易

SELECT
  names.name,
  pages.page_name,
  acl.access
FROM names
LEFT JOIN acl ON acl.name_ID = names.name_ID
LEFT JOIN pages ON pages.page_ID = acl.page_ID
WHERE
   acl.page_ID=1 AND    # or.. pages.page_name='Page1'
   names.name = 'george'

会给你..

 name  | page_name | acccess
george     Page1        Y
  • 每页一行
  • 每个一行name(无论是什么)
  • 每个设置一行。(访问是/否)
于 2012-08-26T10:45:34.880 回答
0

在这种情况下,我会做一个包含列、ID、名称、页面的表,并存储用户可以在“页面”字段中打开的页面的序列化数组。在 PHP 中,约翰可以打开的页面就像

$pagesj = array(2,4,6,7,9)

;

要将它们存储在数据库中,您可以:

$dbpages = serialize($pagesj);
//insert $dbpages string into db for user John

然后检查 John 是否可以打开给定页面,您只需执行以下操作:

$conn = new PDO("mysql:host=localhost;dbname=mydb","user","pass");
$q = "SELECT Pages from mytable WHERE User = $user";
$pages = $conn->query($q)->fetch(PDO::FETCH_COLUMN);
$allowed_pages = unserialize($pages);
if (in_array($currentpage,$allowed_pages))
{
//user can view page
}
else {
//can't
}

重要的一点是 unserialize 和 in_array,您可以使用自己的方式运行查询,因为我以前从未使用过 PDO::FETCH_COLUMN,我不确定上述是否按预期工作,但想法是尽快序列化页面数据,反序列化它,然后检查页面是否在那里。

这就是我个人的做法,尽管老实说我看不到我以这种方式做你正在做的事情(允许某些用户查看某些页面),我可能会有用户组,或访问区域或一些这样的。

于 2012-08-26T17:20:28.580 回答