sql - 规范化或非规范化 : Store Contact Details (Phone Numbers) in separate Table? 搜索性能?

标签 sql asp.net-mvc linq database-design

我正在设计一个存储简单联系信息(名字/姓氏等)的数据库应用程序,我还必须存储电话号码。除了电话号码外,我还必须存储它们的用途(手机、企业等),并可能对每个号码进行附加评论。

我的第一个方法是规范化电话号码并将其保存在单独的表中,这样我就有了“联系人”和“电话号码”表。 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/

相关文章:

sql - 如果连接ODBC,MS Access是否支持 "CASE WHEN"子句?

asp.net-mvc - 所需的防伪 token 未提供或无效 - 仅限 Safari

linq - C# EF5 Code First 中多对多关系的 Lambda 表达式

mysql - 如何识别和删除或更新 Mysql 表中的重复行

MySQL - 每个表都应该包含它自己的 id/主列吗?

mysql - 对象.limit(x).sum( :value) ignores the limit(x) -- why?

c# - 根据模型中的枚举设置选中的单选按钮

jquery - 为什么 Asp.Net MVC 5 将 @Scripts.Render ("~/bundles/jquery") 放在 _Layout.cshtml 的底部?

c# - 如何使用 LINQ 获取 List<Order> 中产品的唯一条目

c# - 从数据表中的一组记录计算第一次登录和最后一次注销之间的持续时间