0

電話帳を作っているとしましょう。

クラスの友達

  • ->名
  • ->姓
  • ->都市
  • ->状態
  • ->郵便番号
  • ->電話

私の理解では、データベースに 2 つのテーブルを作成するのがベスト プラクティスですが、FirstName、LastName、Phone を 1 つに、Address 情報を別のテーブルに配置し、ForeignKey を使用してそれらを接続します。このようにして、2 人の友人が同じ住所に住んでいる場合、私は情報を繰り返しません。

その場合、INNER JOIN クエリを使用してクラスを設定する必要がありますか?

この時点でフレームワークを決めていないので、教えていただければ:

CakePHP では、INNER JOIN を使用してクラスを作成できますか、それとも慣習に反しますか? そうでない場合は、代わりに Laravel、Zend、Yii、Symfony、CodeIgniter などの別のフレームワークを使用したほうがよいでしょうか?

たとえば、2 つの異なるオフィスを持つ会社や、夏と冬の家を持つ友人など、複数の場所を持つことができます。

4

3 に答える 3

1

This to me is a questionable case for normalization. Yes, theoretically you could save yourself some redundant entries by having address normalized, but I would really think about how you are going to treat addresses in the system before making this decision. Are addresses always going to be a property of a user (one to one relationship), or are you intending to actually have some sort of address management where a user can have multiple addresses? In the former case, I probably would not normalize, whereas in the latter case, I definitely would.

It really boils to to whether the address, as a stand along object, has any meaning in your system or whether the address is just a one-to-one property of the user.

于 2013-02-19T19:09:47.007 に答える
0

人を一度に複数の住所に関連付けることを計画している場合にのみ、住所を別のテーブルに保存する必要があります。各人の住所が1つしかない場合は、メインテーブルに配置します。私が覚えている電話帳は、人を1つの住所に関連付けるだけです...

そうは言っても、複数のテーブルに移動する場合は、ほとんどの場合、1つのクラスに固執して、結合を実行できます。

于 2013-02-19T19:07:54.837 に答える
0

このようにして、2 人の友人が同じ住所に住んでいる場合、私は情報を繰り返しません。

「正確な」データは問題ないかもしれませんが、アドレスは「あいまい」になる傾向があります。人々はそれらをさまざまな方法で表現し、時にはスペルを間違えることがあります。その場合、どちらのアドレスを使用する必要がありますか: データベースに既に存在するアドレスと新しいアドレスのどちらを使用しますか? それらが実際に同じであり、どれがスペルミスであるかをどうやって知ることができますか? アドレスを「分離」して、エラーやバリエーションが元の人物に「ローカル」に留まるようにすることをお勧めします。

より哲学的な注意: もしあなたがその道を行くなら、通り、郵便番号、都市、国、さらには (固定電話の) 電話番号さえも「正規化」してみませんか? 「正確な」データでそれを行うこともできますが、住所の場合、この概念を極端に押し進めようとすると、システム全体が脆弱になります。

そうは言っても、FK を介して接続された別のテーブルにアドレスを配置することにより、1 人の人が複数のアドレスを持つことを許可することは完全に合理的です (アドレスは人を参照し、その逆ではありません)。それ以外の場合は、アドレスを同じテーブルに保持します。

于 2013-02-19T20:45:53.337 に答える