在数据库中存储首选项/一对一关系

时间:2010-04-08 14:45:04

标签: database database-design

在我的数据库中存储某些对象的设置的最佳方法是什么?

  1. 方法一:使用
    表:公司{CompanyID,CompanyName,AutoEmail,AutoEmailAddress,AutoPrint,AutoPrintPrinter}

  2. 方法二:使用两个表格 表公司{CompanyID,COmpanyName}
    表2 CompanySettings {CompanyID,utoEmail,AutoEmailAddress,AutoPrint,AutoPrintPrinter}

5 个答案:

答案 0 :(得分:1)

我会更进一步......

表1 - 公司

CompanyID (int)
CompanyName (string)

实施例

CompanyID 1
CompanyName "Swift Point"

表2 - 联系类型

ContactTypeID (int)
ContactType (string)

实施例

ContactTypeID 1
ContactType "AutoEmail"

表3公司联系

CompanyID (int)
ContactTypeID (int)
Addressing (string)

实施例

CompanyID 1
ContactTypeID 1
Addressing "name@address.blah"

此解决方案为您提供可扩展性,因为您将来不需要添加列来处理新的联系人类型。

SELECT
   [company].CompanyID,
   [company].CompanyName,
   [contacttype].ContactTypeID,
   [contacttype].ContactType,
   [companycontact].Addressing
FROM
   [company]
INNER JOIN
   [companycontact] ON [companycontact].CompanyID = [company].CompanyID
INNER JOIN
   [contacttype] ON [contacttype].ContactTypeID = [companycontact].ContactTypeID

这会为每个公司提供多行。 “AutoEmail”的行为“AutoPrint”的行,可能在将来的行中为“ManualEmail”,“AutoFax”或“AutoTeleport”。

对HLEM的回应。

是的,这确实是EAV模型。在您希望拥有具有类似数据的可扩展属性列表的情况下,它非常有用。在这种情况下,使用不同的方法联系表示联系人“地址”的字符串。

如果您不想使用EAV模型,接下来应该考虑关系表,而不是将数据存储在平面表中。这是因为这些数据几乎肯定会延伸。

EAV模型和关系模型都不会显着降低查询速度。与(例如)排序相比,连接实际上非常快。返回具有所有相关联系类型的公司的记录,或者实际上特定的联系类型将非常快。我正在研究具有数百万行和类似数据模型的财务MS SQL数据库,并且在亚秒级时间内返回大量数据没有问题。

就复杂性而言,这不是数据库建模方面最技术性的设计,加入表的概念绝对低于我认为的“中级”数据库开发。

答案 1 :(得分:1)

我会根据以下标准考虑您是否需要一个或两个表:

首先是关闭记录存储限制,然后是两个表。

第二,您通常会在查询第一个表时查询计划放在第二个表中的信息吗?然后一个表可能更有意义。如果您通常不需要扩展信息,则单独(且不太宽)的表应该可以提高主数据查询的性能。

第三,你可能需要多个价值的可能性有多大?如果它是一对一的nopw,但是电子邮件地址或电话号码很可能会变成多行,请继续将其作为相关表格。如果你知道没有机会或只有很小的机会,那么假设桌子不是太宽就可以保持一个。

EAV表看起来很好并且可以节省未来的工作,但实际上它们没有。一般来说,如果你需要添加另一种类型,你需要做未来的工作来调整问题等。编写一个脚本来添加一个列需要五分钟,其他工作将需要在结构中无论如何。当你不知道时,EAV表也很难查询;你知道你需要拉多少条记录,因为通常你想要它们在一行上,并且会通过多次加入同一个表来获取信息。这会导致性能问题和锁定,尤其是如果此表对您的设计至关重要。不要使用这种方法。

答案 2 :(得分:0)

这取决于您是否需要有关公司的更多信息。如果您注意到自己添加了像companyphonenumber1 companyphonenumber2等字段等等。那么方法2会更好,因为您将分离您的实体并仅引用公司ID。如果您不打算进行这些更改,并且您认为此表永远不会更改,那么方法1就可以了。

答案 3 :(得分:0)

通常,如果您没有数据重复,那么单个表就可以了。

在你的情况下,你不这样做第一种方法就可以了。

答案 4 :(得分:0)

如果我估计“第二”表中的数据将用于超过50%的查询,我会使用一个表。如果我需要多份数据副本(即多个电话号码,电子邮件地址等),请使用两个表格