我有一个包含大量字段的表。这些字段可以分为逻辑组 - 就像作业的项目经理信息一样。分组本身并不是真正的实体候选人,因为他们没有,也不应该拥有自己的PK。
现在,要对它们进行分组,这些字段有前缀(例如PmFirstName),但我正在考虑将它们分成多个表,主表上的关系为1:1。
当我这样做时,有什么我应该注意的吗?这只是一个糟糕的选择吗?
我可以看到,对于所有额外的连接,我的查询可能会变得更复杂,但是可以通过视图来减轻这些问题吗?如果我们谈论的记录少于10万的表格会对性能产生显着影响吗?
编辑:我会进一步证明非实体候选人的想法。此信息由我们的用户群输入。他们不了解/彼此关心。因此,同一用户可能会提交相同的“projectManager名称”或者此时不会违反任何约束的任何内容。如果我们想关联来自不同用户的条目,我们可以在以后确定管道。如果我将这些东西给予他们自己的密钥,他们将以与主表增长相同的速度增长 - 因为它们基本上是同一实体的一部分。没有用户是从可用的“项目经理”列表中挑选的。
因此,鉴于上述情况,我不认为它们是实体。但也许不是 - 如果你有进一步的想法,请发帖。
答案 0 :(得分:4)
除非有特定的性能原因,否则我通常不会使用1比1的关系。例如,将不常用的大文本或BLOB类型字段存储在单独的表中。
我怀疑此处还有其他事情发生。在您给出的示例中 - PmFirstName - 似乎应该有一个与“ProjectManagers”或“Employees”表相关的pm_id。你确定这些分组都不是真正的实体候选人吗?
答案 1 :(得分:2)
对我而言,除非对于某些行或查询您不会对额外的列感兴趣,否则它们会闻到。例如如果对于大部分查询,您没有选择PmFirstName列,或者对于大部分行,这些列是NULL。
我喜欢气味标签。
答案 2 :(得分:2)
我使用1对1关系来继承类似的构造。
例如,所有债券都有一些基本信息,如CUSIP,优惠券,DatedDate和MaturityDate。这一切都在主表中。
现在每种类型的债券(Treasury,Corporate,Muni,Agency等)都有自己独特的一组列。
在过去,我们只有一个非常宽的表格,包含所有这些信息。现在我们将特定于类型的信息分解为单独的表,这样可以提供更好的性能。
现在,要对它们进行分组,这些字段有前缀(例如PmFirstName),但我正在考虑将它们分成多个表,主表上的关系为1:1。
创建人员表,每个数据库都需要这个。然后在你的项目表中有一个名为PMKey的列,它指向person表。
答案 3 :(得分:0)
为什么你觉得这组领域不是实体候选人?如果不是,那么为什么要尝试用前缀来识别它们?
删除前缀或将其提取到自己的表中。
答案 4 :(得分:0)
如果它们是可以在别处使用的独立逻辑实体,将它们分成单独的表是很有价值的。
所以当前所有项目的“项目经理”可能是1:1,但是后来您可能希望能够让项目经理拥有多个项目。 所以有额外的桌子是好的。
如果您有PrimaryFirstName,PrimaryLastName,PrimaryPhone,SecondaryFirstName,SecondaryLastName,SEcondaryPhone
你可以拥有一个带有FirstName,LastName,Phone
的“Person”表然后您的原始表只需要“PrimaryId”和“SecondaryId”列来替换您之前拥有的6列。
此外,使用SQL可以跨物理位置拆分文件组和表。 因此,您可以拥有一个POST表和一个COMMENT表,它们具有1:1的关系,但COMMENT表位于不同的文件组上,而且位于具有更多内存的不同物理驱动器上。
1:1并不总是闻到。除非没有目的。