0

私は3つのテーブルを持っています:

-ユーザー

-スーパーユーザー

-SpecialUser

SpecialUserおよびSuperUserUserテーブルの拡張です。Userテーブルに{ nameemail}があり、 SuperUser{ idUsersuperPower}があり、 specialUser{ idUser、 }があるとしますhairColor

もちろん、aSpecialUserとaSuperUserにはユーザーテーブルのnameとがあります。emailこれは、ユーザーがまたはである可能性があることを意味しSuperUserますSpecialUser

私の質問は、ユーザーのすべての情報を取得するクエリを実行する方法です(クエリの前に、ユーザーがspecialUserであるかSuperUserであるかはわかりません)。

私は2つの方法について考えました:

-列「userType」(0:彼はspecialUser、1:彼はsuperUser)をユーザーテーブルに配置します

このメソッドでは、IFを内部に使用してMySQLクエリを実行する必要がありますか?(クエリは何になりますか)。または、単純なクエリ(ユーザーテーブルのみを取得する)を実行する必要があります。次に、PHPでifを実行し、適切なテーブル(スーパーテーブルまたは特殊テーブル)をクエリします。

また

-列を配置せず、ユーザーのIDで2つの結合を使用してMySQLクエリを実行します(技術的には、2つの結合のうちの1つは何も返しません)

どちらを使用する必要がありますか?(私はメモリではなく速度のパフォーマンスに関心があります-テーブルに100万行を超えるとしましょう)

4

2 に答える 2

1

これを行う方法は、pseudo-sqlです。

Select * from user
left outer join superuser
left outer join specialuser

そして、すべてを返します。スーパーユーザーのフィールドがnullでない場合、PHPでは、specialuserの場合と同じように、それを操作できます。そして、これには2つの利点があります。

1)ユーザーがどのようなユーザーであるかを示すフィールドはもう必要ありません。結合の内容によってわかります。

2)必要に応じて、ユーザーをスーパーユーザーと特別ユーザーにすることができます。(そして、それを望まない場合は、制約などを使用してそれを防ぐことができます)

于 2013-02-10T00:30:17.730 に答える
1

分岐せずにこれを行うのは難しいかもしれませんが、私には考えがあります。メモリは問題ではないとおっしゃっていましたが、パフォーマンスは問題です。

まず、Userテーブルに列を作成し、提案したように呼び出しuserType、テーブル名の内容に続いて、次のような解析可能な文字列にテーブル列を格納します。

(SuperUser / SpecialUser)、( "idUser、superPower" / "idUser、hairColor")

例:

"SuperUser、idUser、superPower"//スーパーユーザーの場合

疑似コードの場合:

SELECT `userType` FROM `usersTable` WHERE name = [put var here]
Let the returned value be valRet
parse the valRet into an array... //the first value is the table name, the remaining values are column names
make a second sql query based on the array

パフォーマンスに関しては、分岐がないのでこれは良いことだと思います。ただし、文字列の解析でどのようなパフォーマンスヒットが発生するかはわかりません。数千のクエリでベンチマークしてみてください。

//同様の質問への回答もここで確認してください: MySQLSELECTクエリでのIFステートメントの使用

于 2013-02-10T00:56:22.663 に答える