1 つのテーブルだけでわずかにパフォーマンスが向上する可能性がありますが、この決定は主に、データまたは制約の性質が異なるかどうかによって判断する必要があります。
もう 1 つ (パフォーマンスの観点からより重要な) 決定を下す必要があります: データをどのようにクラスター化しますか (すべてのInnoDB テーブルはクラスター化されます)?
特定のページのすべてのリンクを取得する優れたパフォーマンスが必要な場合は、識別関係を使用して、リンク テーブルに自然なキーを生成します。
LINK テーブルは事実上、ページ PK 1がその前縁にある単一の B ツリーであり、同じページに属する行を物理的にグループ化します。次のクエリは、単純なインデックス レンジ スキャンと最小限の I/O で満たすことができます。
SELECT URL
FROM LINK
WHERE PAGE_ID = <whatever>
別々のテーブルを使用した場合は、2 つの異なるクエリを使用できます。多くのクライアント API は、1 回のデータベース ラウンドトリップでの 2 つのクエリの実行をサポートしています。PHP がそうでない場合は、2 つのクエリを UNION して、1 つのデータベース ラウンドトリップを節約できます。
SELECT *
FROM (
SELECT 1 LINK_TYPE, URL
FROM IMAGE_LINK
WHERE PAGE_ID = <whatever>
UNION ALL
SELECT 2, URL
FROM WEB_LINK
WHERE PAGE_ID = <whatever>
)
ORDER BY LINK_TYPE
上記のクエリはあなたに...
LINK_TYPE URL
1 http://somesite.com/foo.jpeg
1 http://somesite.com/bar.jpeg
1 http://somesite.com/baz.jpeg
...
2 http://somesite.com/foo.html
2 http://somesite.com/bar.html
2 http://somesite.com/baz.html
...
...これは、クライアント レベルで簡単に分離できます。
個別のテーブルを使用しなかった場合は、クライアント レベルで拡張子によって URL を分離するか、LINK PK に追加のフィールド {PAGE_ID, LINK_TYPE, URL} を導入することができます。これにより、次のクエリが非常に効率的になります。
SELECT LINK_TYPE, URL
FROM LINK
WHERE PAGE_ID = <whatever>
ORDER BY LINK_TYPE
PK 内のフィールドの順序は重要であるため、LINK_TYPE を最後に配置すると、DBMSがインデックス範囲スキャンを実行できなくなることに注意してください。
1それが何であれ; PAGE_ID
を例として使用しただけです。