私はある種の意見の質問がありますが、同時に正しい答えがあるかもしれません。私は一連の製品を開発しようとしていますが、自分でやっているので、最初から正しくやることを確認したいと思っています。スキーマを何度も書き直しましたが、そのたびに、より良いと思いました。それから私はいくつかの新しいアイデアに出くわすことができました、そしてそれはスキーマで多くの仕事を必要とするか、それは私のスキーマを壊すでしょう。
大学では、データベースの「合理化」(彼らが使用した言葉だと思いますが、かなり離れている可能性があります)について学びました。5つのレベルがあります。私が覚えていることから、レベル3が最も一般的でした。データが繰り返されないようにするのが慣例であり、そのためには、テーブルを小さなテーブルに分割する必要がありました。そして、あなたがそれをどこまで壊したかに応じて、レベルはより高くなりました。ええと、最高レベルが欲しいかどうかはわかりませんが、できるだけ効率的にしたいと思っています。私は4年間のSQLServer2000/2005/2008と2年間のOracle、約6か月のInformix(5年以上前)、ここかそこかでのmySQLと約6か月のAccessを経験しました。私の好みはSQLServerですが、どちらのプラットフォームでもスキーマを同じように効率的にしたいと思います。
これがいくつかのテーブルの疑似スキーマレイアウトです。次に、私が何をしたいのかを説明します。
Manufacturers
ManufacturerID (Identity)
ManufacturerName
ManufacturerStreetAddress
ManufacturerZipCodeID
...
ZipCodes
ZipCodeID (Identity)
ZipCode
ZipCodeStateID
...
States
StateID (Identity)
StateName
StateAbbreviation
...
Cities
CityID (Identity)
CityName
CityStateID
...
疑似スキーマに過ぎないことをお詫びしますが、休憩時間に紙でデザインをしているので、今はそれだけですが、行き過ぎる前に質問がありました。私がやりたいのは、すべてが適切に相互に結びついていることを確認することです。私の考えでは、郵便番号は州と市に属していますが、1つの郵便番号に属する市はありません。多くの郵便番号が含まれている可能性があります。郵便番号をManufacturersテーブルに入れると、州と市を取得できるようになります。ただし、他のテーブルでIDを何度も使用したくありません。つまり、ZipCodesとCitiesにStateIDがあるということは、何度も繰り返される可能性があるということです。州は同じ名前の複数の都市を持つことができ、複数の州は同じ名前の都市を持つことができます。しかし、CityNamesテーブル、次にCityStatesテーブル(CityNameIDとStateID)が必要かどうかはわかりません。私は、購入できるロケーションデータベースがあり、おそらく無料で使用でき、これについて心配する必要がないことをよく知っています。ただし、将来的にはスキーマの設計に役立つと思うだけでなく、何か変更が必要になった場合にレイアウトをカスタマイズできるようにしたいので、この理解に取り組みたいと思います。
質問:
- その疑似スキーマは、それ自体が正しいように見えますか、それとももっと良いでしょうか(意見)?
- それはデータベースの「合理化」と呼ばれていますか、それとも他の何か(正解に投票します)ですか?そして、どこまで遠すぎるか(意見)
- Usersテーブル、およびアドレス(Teams、Capitolsなど)を含む他のテーブルもあります。したがって、psuedoスキーマは、理論的に正しい場合、そのようなデータベース(意見)の良い計画になるでしょうか?
いつもありがとうございました。徹底的で首尾一貫した回答に投票します。データベースの専門家またはデータベースの長年の経験を持つ人が望ましいですが、私はすべての答えに耳を傾けます。また、これがコミュニティWikiであるかどうかはわかりませんが、現時点では1つとしてマークしていません。ありがとう。
更新:また、データベースの「合理化」により、結合や場合によってはサブクエリが必要になることを私は知っていることを忘れました。私は通常、LEFT OUTER JOINを悪用しますが、4つの異なるクエリを実行するのではなく、これらのテーブルを結合してアドレスを表示する最も効率的な方法は何でしょうか。ありがとう。
更新:わかりました。これは正規化されすぎているか、十分に正規化されていないか、まったく正規化されていない可能性がありますが、この疑似スキーマの方が好きかどうか教えていただけますか?
Manufacturers
ManufacturerID (Identity)
ManufacturerName
ManufacturerStreetAddress
ManufacturerCCSZID --CCSZ (Country, City, State, Zip), needs a better name
...
ZipCodes
ZipCodeID (Identity)
ZipCode
...
States
StateID (Identity)
StateName
StateAbbreviation
...
Cities
CityID (Identity)
CityName
...
Countries
CountryID (Identity)
CountryName
CountryAbbreviation
...
CountryCityStateZipCodes
CountryCityStateZipCodeID (Identity)
CCSZCountryID
CCSZStateID
CCSZCityID
CCSZZipCodeID
住所を取得するには、次のようになります。
SELECT M.ManufacturerStreetAddress,
CN.CountryName,
CN.CountryAbbreviation,
S.StateName,
S.StateAbbreviation,
C.CityName,
Z.ZipCode
FROM Manufacturers M
LEFT OUTER JOIN CountryCityStateZipCodes CCSZ ON CCSZ.CountryCityStateZipCodeID = M.ManufacturerCCSZID
LEFT OUTER JOIN Countries CN ON CN.CountryID = CCSZ.CCSZCountryID
LEFT OUTER JOIN States S ON S.StateID = CCSZ.CCSZStateID
LEFT OUTER JOIN Cities C ON C.CityID = CCSZ.CCSZCityID
LEFT OUTER JOIN ZipCodes Z ON Z.ZipCodeID = CCSZ.CCSZZipCodeID
あるいは、そのクエリを書くためのより良い方法を知っているかもしれません。しかし、それにもかかわらず、それは最初のスキーマよりも良く見えますか?