У меня вопрос своего рода мнения, но в то же время у меня может быть правильный ответ.Я пытаюсь разработать набор продуктов и хочу убедиться, что, поскольку я делаю это сам, я делаю это правильно с первого раза.Я переписывал схему несколько раз, каждый раз думая, что это лучше.Тогда я мог бы натолкнуться на какую-то новую идею, и это потребовало бы либо большой работы над схемой, либо сломало бы мою схему.
В колледже я узнал о «рационализации» (я думаю, что это слово онииспользуется, может быть далеко) база данных и есть 5 уровней.Из того, что я помню, уровень 3 был самым распространенным.Я знаю, что практикой было следить за тем, чтобы данные не повторялись, и для этого нужно было разбивать таблицы на более мелкие.И в зависимости от того, как далеко вы его разбили, тем выше был уровень.Ну, я не знаю, хочу ли я наивысшего уровня, но я знаю, что хочу, чтобы он был настолько эффективным, насколько я могу его получить.У меня было 4 года на SQL Server 2000/2005/2008 и 2 года на Oracle, около 6 месяцев с Informix (5+ лет назад), здесь или там с MySQL и около 6 месяцев доступа.Я предпочитаю SQL Server, но я хотел бы, чтобы схема была максимально эффективной на любой платформе.
Вот схема схемы psuedo для некоторых таблиц, затем я объясню, что я хочу сделать.
Manufacturers
ManufacturerID (Identity)
ManufacturerName
ManufacturerStreetAddress
ManufacturerZipCodeID
...
ZipCodes
ZipCodeID (Identity)
ZipCode
ZipCodeStateID
...
States
StateID (Identity)
StateName
StateAbbreviation
...
Cities
CityID (Identity)
CityName
CityStateID
...
Я извиняюсь за то, что это только схема псевдо, но это все, что у меня есть сейчас, так как я делаю дизайн на бумаге в перерыве, но у меня был вопрос, прежде чем я зашел слишком далеко.Что я хочу сделать, так это убедиться, что все правильно связано друг с другом.Я считаю, что почтовый индекс принадлежит штату и городу, но ни один город не принадлежит ни одному единственному почтовому индексу, их может быть много.Если я добавлю почтовый индекс в таблицу производителей, я хочу получить название штата и города.Но я не хочу использовать идентификаторы слишком много раз в других таблицах.Я имею в виду, что StateID в ZipCodes и Cities может быть слишком много раз.В штате может быть несколько городов с одинаковыми именами, а в нескольких штатах могут быть города с одинаковыми именами.Но я не уверен, что мне нужна таблица CityNames, а затем таблица CityStates (CityNameID и StateID).Я хорошо знаю, что есть базы данных местоположения для покупки, может быть, некоторые бесплатные, которые я мог бы использовать, и мне не пришлось бы об этом беспокоиться.Тем не менее, я хотел бы поработать над моим пониманием этого, потому что я считаю, что это поможет мне в разработке схемы в будущем, а также потому, что я хотел бы иметь удобство компоновки, если нужно что-то изменить.
Вопросы:
- Кажется ли эта схема псевдо, как она есть, правильной или лучше (мнение)?
- Называется ли она "рационализацией" базы данных, иличто-то еще (проголосует за правильный ответ)?И как далеко слишком далеко (мнение)
- Также будет таблица Users и другие таблицы, которые будут включать адреса (команды, капиталы и т. Д.), Как и схема psuedo, если она верна вТеория, будь хорошим планом для такой базы данных (мнение)?
Спасибо всем за ваше время, я буду голосовать за любой ответ, который является полным и последовательным.Предпочтение отдается экспертам по базам данных или людям с многолетним опытом работы с базами данных, но я выслушаю все ответы.Кроме того, я не уверен, должна ли это быть вики сообщества, но сейчас я не отмечаю ее как одну.Спасибо.
Обновление : Кроме того, я забыл упомянуть, что при "рационализации" базы данных возникает необходимость в объединениях, а иногда и в подзапросах.Я обычно злоупотребляю ЛЕВЫМИ НАРУЖНЫМИ СОЕДИНЕНИЯМИ, но какой самый эффективный способ связать эти таблицы для отображения адреса, а не выполнять 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
Или, может быть, вы, ребята, знаете лучший способ написать этот запрос.Но независимо от того, выглядит ли это лучше, чем первая схема?