3

ユーザープロファイル。2つまたは3つのオプションしかない属性がいくつかあります。たとえば、性別をtinyint(male = 1、female = 2)としてテーブルに保存します。したがって、テーブルにはtinyintがありますが、フロントエンドでは文字列を表示する必要があります。約2つのオプションを持つ約4つの属性があります。

したがって、オプションから文字列を表示する方法には2つのオプションがあります。

すべての属性オプションが格納される追加のテーブルを作成します。しかし、この場合、私は余分な参加のたびにそのような小さなもののために作成する必要があります。

または、この種の属性のすべての関数をprofile_helper.phpに入れることができます。例えば

function getGender($optionId){
  $gender = $optionId == 1 ? "male" : "female";
  return $gender;
}

パフォーマンスについて言えば、このような小さなことのために追加の参加をする価値はありますか?

4

5 に答える 5

3

あなたはあなたの人生を楽にし、次のようにすべての可能性を列挙することができます:

`gender` ENUM( 'MALE', 'FEMALE')

このように、文字通り'MALE'または'FEMALE'データベースに値を挿入し、データベースから値を取得すると、それらの文字列の1つが返され、必要なヘルパー関数はまたはucfirst()ですstrtolower()

このアプローチは、変更される可能性が非常に低いもの(性別が完璧な例です)にのみお勧めします。

于 2012-06-28T19:15:37.570 に答える
0

私は間違いなくSQLルートに行きます。将来的にはよりスケーラブルになります。明らかに性別の問題ではありませんが、他のオプションが何であるかによっては、将来の時間を節約できる可能性があります。だから次のようなもの:

SELECT tblGender.gender FROM tblGender, tblUser WHERE tblUser.genderID = tblGender.genderID AND tblUser.userID = "x"
于 2012-06-28T19:14:34.863 に答える
0

私は属性テーブルのファンではありません。SQLも最適化されません。いくつかのものは別のテーブルに正規化する必要があります。すべきでないこともあります。それは本当にあなたの構造とあなたがやろうとしていることに依存します。

性別の場合、多言語アプリを構築している場合は、とにかく言語ツールにマッピングする必要があるため、データベース内の関数、定数、またはENUMは、変更される可能性が低いデータに対してはすべて問題ありません。 。

于 2012-06-28T19:19:22.650 に答える
0

まあ、それは異なります。それが性別であり、それが確実に成長しない場合、定数クラスは私が行うことです。

class Constants {

    public static $gender = array(0 => 'male', 1 => 'female');

    public static function getGender( $value ) {

        if ( !empty(self::$gender[$value])) {
            return self::$gender[$value];
        }
    }
}

カプセル化して実行したい場合、つまり:

echo Constants::getGender($user->gender);

ただし、頻繁に変更する値が必要な場合は、SQLの方法を使用してください。これは、「性別のような」問題でない限り、ハードコーディングするのは適切ではないためです。

IMHO、性別は男性と女性以上になることはないので、これに参加する必要はありません。

乾杯

于 2012-06-28T19:25:38.963 に答える
0

2つ目のテーブルがあります。柔軟性があり、スケーラブルで、性別の変更や追加が簡単です(つまり、指定されていません)

SELECT person.id, gender.name
FROM person
INNER JOIN gender
ON person.genderid = gender.id

それでも、パフォーマンスに関しては非常に効率的です。現在、値が2つしかないため、ばかげているように見えますが、正規化ルールに従うべきではないという意味ではありません。

于 2012-06-28T19:34:25.153 に答える