0

DB テーブルに 20 を超えるフィールドを持つテーブルがあっても大丈夫ですか?

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

「2」のような各フィールドは、Y または N のみを保持します。それとも、1 つのテーブルにフィールドを含めるのは悪い考えですか? これにより、サーバーのパフォーマンスが低下しますか?

また、テーブルには約 20 個以上の ID が含まれる場合があります。

4

3 に答える 3

0

この場合、列、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 を使用したことがなく、上記が意図したとおりに機能するかどうかわからないため、クエリを実行する独自の方法を使用できますが、アイデアはページデータをできるだけ早くシリアライズし、シリアライズを解除してから、ページがそこにあるかどうかを確認します。

これは私が個人的に行う方法ですが、正直に言うと、この方法であなたがしていること(特定のユーザーに特定のページの閲覧を許可する)を私が行っているのを見ることはできません.そのような。

于 2012-08-26T17:20:28.580 に答える
0

データベースの速度が低下するかどうかはわかりませんが、データベースの設計はあまり良くありません。設計を最適化するためにできることは次のとおりです。

table:ID | NAMEと別の table:ID | NUMBER | BOOLEANを作成し、2 つの 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
  • 各ページに 1 行
  • それぞれに1行name(それが何であれ)
  • 設定ごとに 1 行。(アクセスY/N)
于 2012-08-26T10:45:34.880 に答える