3

さて、私は小さなコミュニティのウェブサイトを作成しています。ユーザーが私のサイトに参加し、彼は自分の情報を入力して写真をアップロードし、友達を追加して自分の壁に投稿するオプションがあります。ここまでで、アルバムテーブルの実装方法を知りたいと思います。

アルバムには次の属性があります。

albumID
albumName
albumCover
albumDescription
albumDate
albumPrivacy enum
userID
username

ここで、albumsテーブルをusersテーブルにリンクする方法を知りたいです。すべてのユーザーにはIDとユーザー名があります。usersIdは主キーであり、ユーザー名は一意です。
1人のユーザーが多くのアルバムを持つことができます。1枚のアルバムは1人のユーザーにのみ属することができます。どうすれば人間関係を築くことができますか?

私はデータベースがあまり得意ではなく、最適化された安全な方法で物事を成し遂げたいので、助けてください。

今では、アルバムテーブルの属性としてusersidとusernameを使用して、どのアルバムが誰に属しているかを識別しています。このようにSELECT * FROM albums WHERE userid='$userid' AND username ='$username'
ここで、$ useridはセッション変数からの値であり、$usernameはセッション変数からの値です。

4

2 に答える 2

2

あなたがそれをした方法はかなり正しいです。アルバムテーブルにはuserID列があれば十分です。これは、userテーブルの主キーであり、一意であることが保証されているためです。アルバムテーブルにユーザー名列を含めることは冗長です。

アルバムテーブルのuserID列がFOREIGNKEYとして定義されており、もちろんインデックスが適用されていることを確認する必要があります。

于 2012-01-22T01:22:35.610 に答える
2

ユーザー名はUsersテーブルにありますか?もしそうなら、あなたはそれをアルバムテーブルに含めることについても心配する必要はありません。

usersIdは主キーであり、ユーザー名は一意です。

明確にするために、userIDはUsersテーブルの主キーである必要がありますが、Albumsテーブルの外部キーです(マシューが述べたように)。「albumID」は、Albumsテーブルの主キーとなる列です。

WHERE句にユーザー名を含める必要がないため、SELECTSQLも簡略化できます。ユーザーが複数のユーザー名を持つことはできないと想定しているので、WHEREにuserIDを記載するだけで十分です。

ただし、アルバムの結果セットにユーザー名を表示したい場合は、次のようにすることができます。

SELECT a.*, u.username
FROM albums a
INNER JOIN users u ON u.userid = a.userid
WHERE a.userid='$userid';

また、SQLコマンド文字列を連結するのではなく、SQLステートメントを(PHPコードで)実際にパラメーター化する必要があることにも言及せざるを得ません。これにより、SQLインジェクション攻撃から保護されます。ユーザー入力ではより大きな危険があるため、セッション変数を使用しても問題ありません。しかし、それでも入るのは良い習慣です。

于 2012-01-22T01:30:33.670 に答える