Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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
Sql 如何强制城市实体的名称在所有地区(语言)中都可用?_Sql_Database Design_Entity Relationship - Fatal编程技术网

Sql 如何强制城市实体的名称在所有地区(语言)中都可用?

Sql 如何强制城市实体的名称在所有地区(语言)中都可用?,sql,database-design,entity-relationship,Sql,Database Design,Entity Relationship,我想设计一个数据库,其中城市名称必须存在于所有可用的语言环境中。我目前服务于以下地区: 嗯,fr,它和es 我最初的想法是将名称保存在cities表中,但不是只有一个name字段,而是使用name en、name fr、name es和name it 因此,伦敦金融城在cities表中的保存方式如下: 我的第二个想法是,有一个包含所有服务区域设置的表更适合生产,这样一旦我们添加了一个新的区域设置,它就会作为一个额外的选项自动出现在网站上。因此,我做了这个ERD: 这意味着城市和地区之间的多对多将

我想设计一个数据库,其中城市名称必须存在于所有可用的语言环境中。我目前服务于以下地区:

嗯,fr,它和es

我最初的想法是将名称保存在cities表中,但不是只有一个name字段,而是使用name en、name fr、name es和name it

因此,伦敦金融城在cities表中的保存方式如下:

我的第二个想法是,有一个包含所有服务区域设置的表更适合生产,这样一旦我们添加了一个新的区域设置,它就会作为一个额外的选项自动出现在网站上。因此,我做了这个ERD:

这意味着城市和地区之间的多对多将生成下表:

到目前为止还不错,但我不知道如何强制一个新的城市一旦被添加,它必须有它的名字在所有地区都可用。或者,这只能使用后端代码吗

注: 这是一项招聘任务,所以我没有具体的业务规则,只是为了想出一个智能的、可扩展的解决方案


谢谢。

在第一个解决方案中,您可以使用检查约束:

alter table t add constraint check_all_names
    check (name_en is not null and name_fr is not null and name_es is not null and name_it is not null);
第二种方法基本上不可能使用SQL中设计良好的数据模型。为什么?

要插入城市地区,您需要有效的城市id。 根据定义,在拥有所有地区之前,您不能拥有有效的城市id。 此外,在插入行时,约束通常需要为true。假设您有多个区域设置,则不能在city_区域设置中插入一行并使约束为true


解决这个问题的一种方法是在cities表上设置一个标志,指定是否创建了所有区域设置。您可以使用触发器更新区域设置的数量。或者,您可以使用视图并动态计算标志。

可扩展的解决方案/解决方案可能使用暂存表,在其中存储插入/更新的多对多并启用触发器。。。当为所有地区添加/更新城市翻译时,让触发器将数据从暂存复制到live表,并从暂存中删除复制的数据。。假设您还撤销了live table上所有用户的插入/更新权限,那么live table以何种方式没有触发器开销,再加上您已经强制执行了业务规则