如果我的数据库表中有超过 20 个字段的表,可以吗?
ID | NAME | 1 | 2 | 3 | .....
像“2”这样的每个字段都只包含 Y 或 N。或者在一张表中有这样的字段是个坏主意?这会降低我的服务器性能吗?
并且表中可能有大约 20 个或更多的 Id。
如果我的数据库表中有超过 20 个字段的表,可以吗?
ID | NAME | 1 | 2 | 3 | .....
像“2”这样的每个字段都只包含 Y 或 N。或者在一张表中有这样的字段是个坏主意?这会降低我的服务器性能吗?
并且表中可能有大约 20 个或更多的 Id。
我不知道它是否会减慢数据库的速度,但它不是一个很好的数据库设计,不。您可以采取以下措施来优化设计:
制作一个表:ID | NAME
和另一个表:ID | NUMBER | BOOLEAN
并将两个 ID 链接在一起。
您可能会以这种方式编写更多 PHP 代码,但它会使数据库更易于管理和更整洁。
如果你做额外的桌子会更好
表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
(无论是什么)在这种情况下,我会做一个包含列、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,我不确定上述是否按预期工作,但想法是尽快序列化页面数据,反序列化它,然后检查页面是否在那里。
这就是我个人的做法,尽管老实说我看不到我以这种方式做你正在做的事情(允许某些用户查看某些页面),我可能会有用户组,或访问区域或一些这样的。