DB テーブルに 20 を超えるフィールドを持つテーブルがあっても大丈夫ですか?
ID | NAME | 1 | 2 | 3 | .....
「2」のような各フィールドは、Y または N のみを保持します。それとも、1 つのテーブルにフィールドを含めるのは悪い考えですか? これにより、サーバーのパフォーマンスが低下しますか?
また、テーブルには約 20 個以上の ID が含まれる場合があります。
DB テーブルに 20 を超えるフィールドを持つテーブルがあっても大丈夫ですか?
ID | NAME | 1 | 2 | 3 | .....
「2」のような各フィールドは、Y または N のみを保持します。それとも、1 つのテーブルにフィールドを含めるのは悪い考えですか? これにより、サーバーのパフォーマンスが低下しますか?
また、テーブルには約 20 個以上の ID が含まれる場合があります。
この場合、列、ID、名前、ページを含む 1 つのテーブルを作成し、ユーザーがページ フィールドで開くことができるページのシリアル化された配列を格納します。PHP では、John が開くことができるページは次のようになります。
$pagesj = array(2,4,6,7,9)
;
それらをDBに保存するには、次のようにします。
$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 を使用したことがなく、上記が意図したとおりに機能するかどうかわからないため、クエリを実行する独自の方法を使用できますが、アイデアはページデータをできるだけ早くシリアライズし、シリアライズを解除してから、ページがそこにあるかどうかを確認します。
これは私が個人的に行う方法ですが、正直に言うと、この方法であなたがしていること(特定のユーザーに特定のページの閲覧を許可する)を私が行っているのを見ることはできません.そのような。
データベースの速度が低下するかどうかはわかりませんが、データベースの設計はあまり良くありません。設計を最適化するためにできることは次のとおりです。
table:ID | NAME
と別の table:ID | NUMBER | BOOLEAN
を作成し、2 つの 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
(それが何であれ)