在我的数据库中存储某些对象的设置的最佳方法是什么?
方法一:使用单表
表:公司{CompanyID,CompanyName,AutoEmail,AutoEmailAddress,AutoPrint,AutoPrintPrinter}
方法二:使用两个表格
表公司{CompanyID,COmpanyName}
表2 CompanySettings {CompanyID,utoEmail,AutoEmailAddress,AutoPrint,AutoPrintPrinter}
答案 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%的查询,我会使用一个表。如果我需要多份数据副本(即多个电话号码,电子邮件地址等),请使用两个表格