[英]MySQL, how to restructure optional multiple foreign keys
对于此示例,我正在尝试构建一个系统,该系统将允许来自多个来源的输出,但是尚未构建这些来源。 输出“模块”将是一个组件,每个源将是其自己的组件,以供以后构建和扩展。
这是我在MySQLWorkbench中设计的一个示例:
目标是使我的输出模块显示输出表中的数据,同时在以后构建更多源时轻松对其进行扩展。 我还想在添加新源时最小化架构更新。 当前,我将必须为每个源添加一个新表,然后将一个外键添加到输出表。
有一个更好的方法吗? 我不知道我对这些可为NULL的外键的感觉如何,因为JOIN查询将包含IFNULL并将很快变得不规则。
思考?
编辑1:澄清
我将使用输出表中的数据显示网格。 输出表将包含网格中所有项目的常规数据,并且基本上将充当output_source_X表的聚合器:
output(id, when_added, is_approved, when_approved, sort_order, ...)
output_source_X表将包含特定于源的其他数据。 例如,假设输出源表之一用于Facebook帖子,因此该表将包含特定于Facebook API的列:
output_source_facebook(id, from, message, place, updated_time, ...)
另一个可能是Twitter,因此这些列专门针对Twitter:
output_source_twitter(id, coordinates, favorited, truncated, text, ...)
第三个输出源表可以是Instagram,因此output_source_instagram表将包含特定于Instagram的列。
与输出表和output_source_X表中只有一个一对一的外键关系,这取决于输出项是Facebook,Twitter,Instagram还是其他类,因此,可以为NULL的外键键。
output table
------------
foreign key (source_id_facebook) references output_source_facebook(id)
foreign key (source_id_twitter) references output_source_twitter(id)
foreign key (source_id_instagram) references output_source_instagram(id)
我想我担心的是这不是我想要的模块化,因为我也想添加其他源,而不必太多更新架构。 当前,这要求我使用任何不为null的外键在输出表上加入output_source_X。
这种设计在某些方面几乎可以肯定是不好的。
目前尚不清楚您的设计代表什么,但是简单的设计将是这样的:
// source [id] has ...
source(id,message,...)
// output [id] is approved when [approved]=1 and ...
output(id,approved,...)
// output [output_id] has [source_id] as a source
output_source(output_id,source_id)
foreign key (source_id) references source(id)
foreign key (source_id) references source(id)
也许您有不同的输出和/或来源子类型? 基于来源和/或输出? 也许每个来源都只能提供特定的输出? 是“产出”和“源”实际上是种输出和来源,这是信息不输出的方式采购,但对信息什么样的输出源配对的是permittted?
请为我们提供您要针对应用程序编写的基本语句的参数,这些语句由列名参数化。 即针对您感兴趣的应用程序关系。(例如,如上面的代码注释。)(您可以为图解设计完成此操作,但可能会过于复杂且不能真正反映您要建模的内容。)
重新编辑:
与输出表和output_source_X表中只有一个一对一的外键关系,这取决于输出项是Facebook,Twitter,Instagram还是其他类,因此,可以为NULL的外键键。
您有一个超类型的多个不相交子类型的情况。
您的情况与该问题非常相似,不同之处在于它们具有一个子类型区分符/标签列,该列指示哪个子类型表,您具有一组列,非空列指示哪个子类型表。 请参阅Erwin Smout和我的答案。 也这个答案 。
请为您提供关于您的应用程序的基本陈述的列名称参数化的陈述
并且您会发现简单明了的语句(如上所述)。 如果您给出当前设计的陈述,您会发现它们很复杂。 另请参阅。
我想我担心的是这不是我想要的模块化,因为我也想添加其他源,而不必太多更新架构。
与正确的子类型设计相比,您的结构并未减少架构更改。
无论如何,DDL在那里。 您可以仅通过丢失DBMS管理完整性来通用化子类型以避免DDL。 仅基于评估DDL与DML性能的权衡,这才是相关或合理的。 搜索重新(通常是反模式)EAV。
( 仅当您表明创建和删除新表是不可行的,并且对应的可怕的完整性和并发性挑战的巨型联接表和元数据编码表中的EAV信息等效设计才是可行的,才应考虑使用EAV 。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.