Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在SQL中实现继承_Mysql_Sql - Fatal编程技术网

Mysql 在SQL中实现继承

Mysql 在SQL中实现继承,mysql,sql,Mysql,Sql,我遇到了一个类项目的问题,该类项目包括(使用merise)为应用商店之类的应用程序建模数据库。我已经到了这样一个地步,我有一个实体关系模型,它非常适合我,并且似乎符合主题的约束条件 在这个建模中,我使用继承来标记和app之间的区别,以及一个附加组件,两者都有共同的特征。事实上,它们具有完全相同的特征,但它们受到不同联想的影响 以下是一个可能有助于您理解的屏幕截图: 我希望将Software作为一个视图,以及App和AddOn表,假设后两个表不会有相同id的条目。但我不知道如何做到这一点,也许这

我遇到了一个类项目的问题,该类项目包括(使用merise)为应用商店之类的应用程序建模数据库。我已经到了这样一个地步,我有一个实体关系模型,它非常适合我,并且似乎符合主题的约束条件

在这个建模中,我使用继承来标记和app之间的区别,以及一个附加组件,两者都有共同的特征。事实上,它们具有完全相同的特征,但它们受到不同联想的影响

以下是一个可能有助于您理解的屏幕截图:

我希望将
Software
作为一个视图,以及
App
AddOn
表,假设后两个表不会有相同id的条目。但我不知道如何做到这一点,也许这不是正确的方法,所以我愿意接受建议

我希望我说得够清楚,如果不清楚,请不要犹豫,让我说得更准确一些


谢谢你的阅读

您已经确定了
App
Addon
需要不同的表,因为它们有不同的关联。好!

我建议将软件实现为一个基表,因为您不能向视图声明引用完整性(在您的图片中分类为…)。我也注意到了其他一些新的关联

Software(
   software_id
  ,type
  ,name
  ,price
  ,entry_date
  ,description
  ,primary key(software_id)
)
我添加了一个discriminator列
type
,它应该包含一个值,用于标识这段软件是一个插件还是一个应用程序

Addon(
   software_id
  ,primary key(software_id)
  ,foreign key(software_id) references software(software_id)
)

App(
   software_id
  ,primary key(software_id)
  ,foreign key(software_id) references software(software_id)
)
请注意,插件和应用程序中的主键指的是软件中的主键。在某种程度上,您可以将软件id视为一种“数据类型”。插件中的列software_id不仅仅包含任何随机唯一的数字。该值必须来自标识软件的数字之一


这就是你想要的答案吗?

你是被迫使用MySQL的吗?PostgreSQL支持表继承是的,我支持。我们已经幸运地成为第一个不需要使用Oracle的舞会,如果我被迫使用MySQL而不是甲骨文,我不会认为自己是幸运的,但这是我个人的意见(而且完全偏离主题),我说“幸运”是因为上学期,在项目截止日期前三周的大部分时间里,开发服务器都不可用。至少对于MySQL,如果这种情况再次发生,我们可以使用自己的计算机。但我同意,这不是一个与Oracle相关的问题,更像是一个系统管理员,在这两种情况下都是离题的,对不起:-“我对图表的阅读很难被认为是完美的。你能给我引路吗?它说一个附加组件可以扩展0到N个应用程序,对吗?我只是希望它是另一种方式,即一个应用程序被0到N个附加组件扩展。但是,同样,这可能只是我的阅读能力差。>[…]因为你不能向视图声明引用完整性[…]是的。我希望我可以将“category_id”字段移动到“subclass”,尽管我承认我不知道这样做是否有效。否则,您的建议似乎起到了作用,但我想知道:使用此解决方案,插入数据需要两个查询,我错了吗?一个插入到软件视图中,一个插入到两个子类中的一个子类中。是的,只要您使用事务(和innodb),就不会有问题。您还可以使用一个存储过程为您的应用程序处理它。我不知道MySQL是否支持可更新的视图。如果有,那么您可以定义一个插件视图,它是软件和插件(包括所有列)之间的连接。在视图中插入一行将导致在幕后分别插入两个表。但正如我所说的,我不知道它在MySQL中是否有效。今天下午我将尝试一下,但从我的立场来看,将您的解决方案与触发器相结合应该可以做到这一点。另外,根据我刚刚读到的内容,不可能从一个视图中对多个表执行insert。谢谢你的时间!因此,我在这里使用相同的表方案,除了
AddOn
,它有一个
id\u app
字段,反映了由所述AddOn扩展的应用程序。当我在
软件上插入时,我无法提供此字段,我错了吗?@katen,我不确定我是否理解你的意思?扣动扳机?您需要两个代码路径,在数据库(存储过程)或应用程序中,每个子类型(插件、应用程序)一个。