我有一个观点问题,但同时也可能有正确答案。我正在尝试开发一套产品,并希望确保由于我是自己做的,第一次就做对了。我已经多次重写模式,每次都认为它更好。然后我会遇到一些新想法,要么需要在模式上花费大量工作,要么会破坏我的模式。
在大学里,我学到了关于“合理化”(我想这是他们使用的词,可能会完全不同)数据库的知识,有5个级别。据我所知,第3级最常见。我知道实践是确保数据不重复,为此,您必须将表拆分为较小的表。根据您拆分的程度,级别越高。我不知道我是否想要最高级别,但我知道我希望它尽可能高效。我有4年的SQL Server 2000/2005/2008和2年的Oracle,在Informix(5年前)方面接触过6个月左右,这里或那里碰到过mySQL,以及大约6个月的Access。我更喜欢SQL Server,但我希望无论在哪个平台上,架构都是尽可能高效的。
这是一些表的伪代码模式布局,然后我会解释我想做的事情。
抱歉,这只是伪模式,因为我正在休息时在纸上设计,但在继续之前有一个问题。我的想法是邮政编码属于一个州和一个城市,但没有一个城市属于任何一个特定的邮政编码,它可能有很多。如果我将邮政编码放入制造商表中,则希望能够获取州和城市。但我不想在其他表中使用太多ID。我的意思是,在ZipCodes和Cities中都有StateID可能会有点多。一个州可以有多个名称相同的城市,多个州也可以有名称相同的城市。但我不确定是否需要一个CityNames表,然后是一个CityStates表(CityNameID和StateID)。我知道有购买位置数据库的地方,也许有些免费的,我可以使用并且不必担心这个。但是,我想了解这方面的内容,因为我相信这将有助于我今后的模式设计,而且如果需要更改,我也希望具有布局的可定制性。
问题:
1.作为伪模式,它是否正确或是否可以更好(意见)?
2.它被称为“合理化”数据库还是其他什么名称(会投票支持正确答案)?到哪里算过头了(意见)
3.还将有一个用户表以及包括地址(团队,首都等)的其他表,因此,如果伪模式在理论上是正确的,则对于这样的数据库,是否是一个好计划(意见)?
谢谢您所有人的时间,我将投票支持任何详尽和条理清晰的答案。首选数据库专家或具有多年数据库经验的人,但我会听取所有答案。另外,我不确定这是否应该是社区维基,但我现在没有标记它。谢谢。
更新:我忘了提到我知道“合理化”数据库需要连接和有时子查询。我通常滥用LEFT OUTER JOIN,但是除了执行4个不同的查询之外,绑定这些表以显示地址的最有效方法是什么?谢谢。
更新:好吧,现在这可能太规范化了,或者规范化程度不够,或者根本没有,但您们能否告诉我是否喜欢这个伪模式更好?
在大学里,我学到了关于“合理化”(我想这是他们使用的词,可能会完全不同)数据库的知识,有5个级别。据我所知,第3级最常见。我知道实践是确保数据不重复,为此,您必须将表拆分为较小的表。根据您拆分的程度,级别越高。我不知道我是否想要最高级别,但我知道我希望它尽可能高效。我有4年的SQL Server 2000/2005/2008和2年的Oracle,在Informix(5年前)方面接触过6个月左右,这里或那里碰到过mySQL,以及大约6个月的Access。我更喜欢SQL Server,但我希望无论在哪个平台上,架构都是尽可能高效的。
这是一些表的伪代码模式布局,然后我会解释我想做的事情。
Manufacturers
ManufacturerID (Identity)
ManufacturerName
ManufacturerStreetAddress
ManufacturerZipCodeID
...
ZipCodes
ZipCodeID (Identity)
ZipCode
ZipCodeStateID
...
States
StateID (Identity)
StateName
StateAbbreviation
...
Cities
CityID (Identity)
CityName
CityStateID
...
抱歉,这只是伪模式,因为我正在休息时在纸上设计,但在继续之前有一个问题。我的想法是邮政编码属于一个州和一个城市,但没有一个城市属于任何一个特定的邮政编码,它可能有很多。如果我将邮政编码放入制造商表中,则希望能够获取州和城市。但我不想在其他表中使用太多ID。我的意思是,在ZipCodes和Cities中都有StateID可能会有点多。一个州可以有多个名称相同的城市,多个州也可以有名称相同的城市。但我不确定是否需要一个CityNames表,然后是一个CityStates表(CityNameID和StateID)。我知道有购买位置数据库的地方,也许有些免费的,我可以使用并且不必担心这个。但是,我想了解这方面的内容,因为我相信这将有助于我今后的模式设计,而且如果需要更改,我也希望具有布局的可定制性。
问题:
1.作为伪模式,它是否正确或是否可以更好(意见)?
2.它被称为“合理化”数据库还是其他什么名称(会投票支持正确答案)?到哪里算过头了(意见)
3.还将有一个用户表以及包括地址(团队,首都等)的其他表,因此,如果伪模式在理论上是正确的,则对于这样的数据库,是否是一个好计划(意见)?
谢谢您所有人的时间,我将投票支持任何详尽和条理清晰的答案。首选数据库专家或具有多年数据库经验的人,但我会听取所有答案。另外,我不确定这是否应该是社区维基,但我现在没有标记它。谢谢。
更新:我忘了提到我知道“合理化”数据库需要连接和有时子查询。我通常滥用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
也许你们知道更好的编写查询的方法。但不管怎样,这个架构是否比第一个更好呢?