我正在设计一个存储简单联系信息(名字/姓氏等)的数据库应用程序,我还必须存储电话号码。除了电话号码外,我还必须存储它们的用途(手机、企业等),并可能对每个号码进行附加评论。
我的第一个方法是规范化电话号码并将其保存在单独的表中,这样我就有了“联系人”和“电话号码”表。 PhoneNumbers 表将是这样的:
Id int PK
ContactId int FK<->Contacts.Id
PhoneNumber nvarchar(22)
Description nvarchar(100)
但是,如果我只是将此信息存储为每个联系人记录的一部分(假设我限制可以存储的电话号码总数,比如说 4总数)。
但是,我最终得到了这样一个“丑陋”的结构:
PhoneNumber1 nvarchar(22)
Description1 nvarchar(100)
PhoneNumber2 nvarchar(22)
Description2 nvarchar(100)
等等等
这对我来说看起来很业余,但这是我看到的优点:
1) 在 ASP.NET MVC 中,我可以简单地将输入文本框附加到我的 LINQ 对象的属性,然后完成连接记录添加和更新。
2) 无需 SQL Join 即可检索信息。
不幸的是,我对表格宽度问题等问题不是很了解(我读到如果它变得太大/太多列会导致问题并且出现性能问题?)然后这也意味着当我搜索 电话号码如果我将它保存在一个单独的表中,我将不得不查看 4 个字段而不是 1 个。
我的应用程序有大约 80% 的搜索/数据检索事件,因此搜索性能是一个重要因素。
非常感谢您帮助我们找到正确的方法。单独的 table 还是将它们放在一个 table 上?谢谢!
最佳答案
像那样对数据进行非规范化不太可能导致问题,但我不建议这样做。尽管查询起来可能更复杂,但最好是拥有可以通过多种方式操作的格式正确的数据。我会建议这样的数据库模式:
Contacts:
ID (Primary Key)
Name
Job Title
Phone Number Categories:
ID (Primary key)
Name
Phone Numbers:
ID (Primary Key)
Category_ID (Foreign Key -> Phone Number Categories.ID)
Contact_ID (Foreign Key -> Contacts.ID)
Phone Number
这使您可以在允许的电话号码数量上有很大的灵 active ,并使您能够对它们进行分类。
关于sql - 规范化或非规范化 : Store Contact Details (Phone Numbers) in separate Table? 搜索性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1197301/