掌桥专利:专业的专利平台
掌桥专利
首页

一种多租户共享数据的处理方法和系统

文献发布时间:2023-06-19 16:08:01



技术领域

本申请涉及数据库技术领域,更具体地,涉及一种多租户共享数据的处理方法和系统。

背景技术

多租户技术(multi-tenancy technology)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件,并且仍可确保各用户间数据的隔离性。

一个支持多租户技术的系统需要在设计上对它的数据和配置进行隔离,从而使系统的每个租户或组织都能够使用一个单独的系统实例,并且每个租户都可以根据自己的需求对租用的系统实例进行个性化配置。由于要满足租户之间的隔离性,通常来说租户之间的数据是按照不同租户隔离存储的,即使租户之间有一些配置和数据是一致的也会根据租户不同存储多份,每个租户访问自己的数据和配置。

数据和配置的隔离会让用户业务数据完全隔离,特别是在某些特定系统,比如元数据管理系统中,不同租户的配置可能相同也可能不同,但是由于数据隔离,即使是相同的配置,租户之间抓取元数据独立进行,相同配置的两个租户都会在各自实例内部完成元数据抓取和存储。这样即使拥有相同配置的某些资源的数据仍然会存储多份,不仅造成业务性能损耗,还会造成存储的冗余浪费,系统的成本会大大增加。

因此,如何提高多租户共享数据的处理效率并减少存储冗余,是目前有待解决的技术问题。

发明内容

本发明公开了一种多租户共享数据的处理方法,用以解决现有技术中多租户共享数据处理效率低,存储冗余多的技术问题。该方法应用于包括租户数据关联表、共享数据存储表和共享数据表的数据库中,包括:

当接收到租户发送的与目标数据源配置id对应的目标数据时,根据所述目标数据源配置id和所述目标数据的属性生成所述目标数据的目标数据标识和各目标数据切分单元的目标单元标识,其中,各所述目标数据切分单元是根据所述属性切分所述目标数据后生成的;

根据所述目标数据标识和各所述目标单元标识判断数据库中是否存在所述目标数据,若数据库中不存在所述目标数据,将所述目标单元标识存储到所述共享数据表,将所述目标数据标识存储到所述共享数据存储表,进行预设关联操作并存储所述目标数据;

当接收到租户对所述目标数据的查询请求时,根据租户的租户名称、所述租户数据关联表、所述共享数据存储表和所述共享数据表获取所述目标数据,并将所述目标数据返回租户;

其中,所述租户数据关联表表征了租户名称和所述目标数据标识所属的数据标识的关联关系,所述共享数据存储表表征了数据标识、所述目标单元标识所属的单元标识和所述目标数据源配置id所属的数据源配置id的关联关系,所述共享数据表表征了单元标识和所述目标数据所属的真实数据的关联关系,数据源配置id由数据源IP地址和端口号生成,所述预设关联操作为将租户名称和所述目标数据标识关联到所述租户数据关联表并将所述目标数据标识和所述目标单元标识关联到所述共享数据存储表。

相应的,本发明还提供了一种多租户共享数据的处理系统,应用于包括租户数据关联表、共享数据存储表和共享数据表的数据库中,所述系统包括:

生成模块,用于当接收到租户发送的与目标数据源配置id对应的目标数据时,根据所述目标数据源配置id和所述目标数据的属性生成所述目标数据的目标数据标识和各目标数据切分单元的目标单元标识,其中,各所述目标数据切分单元是根据所述属性切分所述目标数据后生成的;

存储模块,用于根据所述目标数据标识和各所述目标单元标识判断数据库中是否存在所述目标数据,若数据库中不存在所述目标数据,将所述目标单元标识存储到所述共享数据表,将所述目标数据标识存储到所述共享数据存储表,进行预设关联操作并存储所述目标数据;

获取模块,用于当接收到租户对所述目标数据的查询请求时,根据租户的租户名称、所述租户数据关联表、所述共享数据存储表和所述共享数据表获取所述目标数据,并将所述目标数据返回租户;

其中,所述租户数据关联表表征了租户名称和所述目标数据标识所属的数据标识的关联关系,所述共享数据存储表表征了数据标识、所述目标单元标识所属的单元标识和所述目标数据源配置id所属的数据源配置id的关联关系,所述共享数据表表征了单元标识和所述目标数据所属的真实数据的关联关系,数据源配置id由数据源IP地址和端口号生成,所述预设关联操作为将租户名称和所述目标数据标识关联到所述租户数据关联表并将所述目标数据标识和所述目标单元标识关联到所述共享数据存储表。

通过应用以上技术方案,当接收到租户发送的与目标数据源配置id对应的目标数据时,根据目标数据源配置id和目标数据的属性生成目标数据的目标数据标识和各目标数据切分单元的目标单元标识;根据目标数据标识和各目标单元标识判断数据库中是否存在目标数据,若数据库中不存在目标数据,将目标单元标识存储到共享数据表,将目标数据标识存储到共享数据存储表,进行预设关联操作并存储目标数据;当接收到租户对目标数据的查询请求时,根据租户的租户名称、租户数据关联表、共享数据存储表和共享数据表获取目标数据,并将目标数据返回租户,从而在保证多租户系统隔离性的同时,提高了多租户共享数据的处理效率并减少了存储冗余。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1示出了本发明实施例提出的一种多租户共享数据的处理方法的流程示意图;

图2示出了本发明实施例中数据表关系ER模型图;

图3示出了本发明实施例提出的一种多租户共享数据的处理系统的结构示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

本申请实施例提供一种多租户共享数据的处理方法,每一个租户通过共享数据的唯一数据标识获取数据,该数据标识是根据租户的配置生成的,如果租户有相同的数据配置或者相交的数据配置,则可以根据数据配置生成对应的数据标识。租户通过该数据标识维护一个到数据的引用,保证租户可以使用到共享数据。由于共享数据的创建只会触发一次,不用每一个租户都各自触发能够有效减少相应的创建成本,此外共享数据只会存储一份,能有效的降低存储成本。

该方法应用于包括租户数据关联表、共享数据存储表和共享数据表的数据库中,如图1所示,包括以下步骤:

步骤S101,当接收到租户发送的与目标数据源配置id对应的目标数据时,根据所述目标数据源配置id和所述目标数据的属性生成所述目标数据的目标数据标识和各目标数据切分单元的目标单元标识。

本实施例中,在数据库中预先构建了租户数据关联表、共享数据存储表和共享数据表,租户数据关联表表征了租户名称和目标数据标识所属的数据标识的关联关系,共享数据存储表表征了数据标识、目标单元标识所属的单元标识和目标数据源配置id所属的数据源配置id的关联关系,共享数据表表征了单元标识和目标数据所属的真实数据的关联关系。

数据源配置id由数据源IP地址和端口号生成。目标数据的属性是一个数据字段,表示目标数据的一个特征,该属性可包括标称属性、二元属性、序数属性、数值属性、离散属性与连续属性。各目标数据切分单元是根据该属性切分目标数据后生成的。

租户需要通过目标数据源配置id对目标数据进行存储,在接收到租户发送的该目标数据时,根据目标数据源配置id和目标数据的属性生成目标数据的目标数据标识和各目标数据切分单元的目标单元标识。

可选的,如图2所示,租户数据关联表的结构为[tenant_name,data_id],共享数据存储表的结构为[data_id,Sdata_id,数据源配置id],共享数据表的结构为[Sdata_id,data],其中,tenant_name是租户名称,data_id为数据标识,Sdata_id为数据切分单元的单元标识。

可选的,数据源配置id =数据源IP地址+端口号,本领域技术人员也可采用其他根据数据源IP地址和端口号的方式生成数据源配置id。

为了准确的生成目标数据标识和目标单元标识,在本申请一些实施例中,根据所述目标数据源配置id和所述目标数据的属性生成所述目标数据的目标数据标识和各目标数据切分单元的目标单元标识,具体为:

根据所述属性切分所述目标数据并获取各所述目标数据切分单元的目标单元数据;

缓存各所述目标单元数据并生成各所述目标单元数据的缓存路径;

根据所述缓存路径获取各所述目标单元数据的数据字节,并按预设标识计算算法对所述数据字节处理后生成各所述目标单元标识;

根据所述目标数据源配置id和各所述目标单元标识生成所述目标数据标识。

本实施例中,先根据属性切分目标数据,从而获取各目标数据切分单元的目标单元数据,然后将各目标单元数据进行缓存并生成相应的缓存路径,再根据缓存路径获取各目标单元数据的数据字节,按照预设标识计算算法对各数据字节处理并生成各目标单元标识,最后根据目标数据源配置id和各目标单元标识生成目标数据标识。

可选的,目标数据标识=目标数据源配置id+各目标单元标识,例如,若各目标单元标识=A + B + …… + C + Y + Z,则目标数据标识=目标数据源配置id+A + B + …… +C + Y + Z。

可选的,预设标识计算函数可以为func DataFLieMD5(flie: Sdata_id[Count,i].URL),Sdata_id[Count,i].URL为所述缓存路径。

为了可靠的获取目标单元数据,在本申请一些实施例中,根据所述属性切分所述目标数据并获取各所述目标数据切分单元的目标单元数据,具体为:

根据所述属性确定各所述目标数据切分单元的属性值Min.length;

调用Length()函数计算并获取所述目标数据的最大属性值MAX.length;

若MAX.length除以Min.length的余数不为零,则所述目标数据切分单元的数量Count=MAX.length/Min.length+1,所述目标数据切分单元的编号Sdata_id[Count,i]=Sdata_id[MAX.length/Min.length+1 , i];

若MAX.length除以Min.length的余数为零,则Count=MAX.length/Min.length,Sdata_id[Count,i]=Sdata_id[MAX.length/Min.length , i];

按Count和Sdata_id[Count,i]切分所述目标数据,获取Count个目标单元数据Sdata_id[Count,i].Data;

其中1≤i≤Count。

本实施例中,属性值Min.length可根据属性进行预设,目标数据切分单元的编号Sdata_id[Count,i]的形式可以为Sdata_id[Count,1],Sdata_id[Count,2],……,Sdata_id[Count, Count-1]和Sdata_id[Count, Count]。

步骤S102,根据所述目标数据标识和各所述目标单元标识判断数据库中是否存在所述目标数据,若数据库中不存在所述目标数据,将所述目标单元标识存储到所述共享数据表,将所述目标数据标识存储到所述共享数据存储表,进行预设关联操作并存储所述目标数据。

本实施例中,可根据目标数据标识和各目标单元标识查询共享数据存储表和共享数据表,判断数据库中是否存在目标数据,若数据库中不存在所述目标数据,则需要将目标数据进行存储,具体的,将目标单元标识存储到共享数据表,并将目标数据标识存储到共享数据存储表,并进行预设关联操作后存储目标数据。预设关联操作为将租户名称和目标数据标识关联到租户数据关联表并将目标数据标识和目标单元标识关联到共享数据存储表。

为了进一步提高数据处理效率,在根据所述目标数据标识和各所述目标单元标识判断数据库中是否存在所述目标数据之后,所述方法还包括:

若数据库中已存在所述目标数据,进行所述预设关联操作。

本实施例中,若数据库中已存在目标数据,则说明不需要再次存储目标数据,仅进行预设关联操作即可,从而减少了数据存储次数。

为了进一步提高数据存储效率,在本申请一些实施例中,存储所述目标数据,具体为:

若所述共享数据存储表中不存在与所述目标数据源配置id相同的数据源配置id,将各所述目标单元标识存储到所述共享数据表,将所述目标数据标识存储到所述共享数据存储表,将所述目标数据标识和用户名称关联到所述租户数据关联表,并将各所述目标单元数据进行存储;

若所述共享数据存储表中存在与所述目标数据源配置id相同的数据源配置id,且所述目标数据源配置id下的所述共享数据表中存在分别与各所述目标单元标识相同的单元标识,进行所述预设关联操作;

若所述共享数据存储表中存在与所述目标数据源配置id相同的数据源配置id,且各所述目标单元标识与所述目标数据源配置id下的所述共享数据表中的单元标识均不相同或一部分相同,根据不相同的目标数据切分单元的编号将对应的不相同的目标单元数据存储,并将所述目标单元标识存储到所述共享数据表,将所述目标数据标识存储到所述共享数据存储表,并进行所述预设关联操作。

本实施例中,将目标数据源配置id与共享数据存储表中各数据源配置id进行比对,若共享数据存储表中不存在与目标数据源配置id相同的数据源配置id,则需要将各目标单元数据进行存储,具体的,将各目标单元标识存储到共享数据表并将目标数据标识存储到共享数据存储表,然后将目标数据标识和用户名称关联到租户数据关联表,并将各目标单元数据进行存储。

若共享数据存储表中存在与目标数据源配置id相同的数据源配置id,将各目标单元标识分别与目标数据源配置id下的享数据表中的单元标识进行比对,若目标数据源配置id下的共享数据表中存在分别与各目标单元标识相同的单元标识,则直接进行预设关联操作;若各目标单元标识与目标数据源配置id下的共享数据表中的单元标识均不相同或一部分相同,则根据不相同的目标数据切分单元的编号将对应的不相同的目标单元数据存储,并将目标单元标识存储到共享数据表,将目标数据标识存储到共享数据存储表,最后进行预设关联操作。

需要说明的是,以上优选实施例的方案仅为本申请所提出的一种具体实现方案,其他存储目标数据的方式均属于本申请的保护范围。

步骤S103,当接收到租户对所述目标数据的查询请求时,根据租户的租户名称、所述租户数据关联表、所述共享数据存储表和所述共享数据表获取所述目标数据,并将所述目标数据返回租户。

本实施例中,当接收到租户对目标数据的查询请求时,先根据租户名称查询租户数据关联表并获取目标数据标识,然后根据目标数据标识查询共享数据存储表并获取目标单元标识,再根据目标单元标识查询共享数据表并获取目标数据,最后将目标数据返回租户。

通过应用以上技术方案,当接收到租户发送的与目标数据源配置id对应的目标数据时,根据目标数据源配置id和目标数据的属性生成目标数据的目标数据标识和各目标数据切分单元的目标单元标识;根据目标数据标识和各目标单元标识判断数据库中是否存在目标数据,若数据库中不存在目标数据,将目标单元标识存储到共享数据表,将目标数据标识存储到共享数据存储表,进行预设关联操作并存储目标数据;当接收到租户对目标数据的查询请求时,根据租户的租户名称、租户数据关联表、共享数据存储表和共享数据表获取目标数据,并将目标数据返回租户,从而在保证多租户系统隔离性的同时,提高了多租户共享数据的处理效率并减少了存储冗余。

为了进一步阐述本发明的技术思想,现结合具体的应用场景,对本发明的技术方案进行说明。

本申请实施例提供一种多租户共享数据的处理方法,包括以下步骤:

S1.创建租户数据关联表、共享数据存储表和共享数据表,如图2所示。

S2.当接收到租户发送的与目标数据源配置id对应的目标数据Data时,根据目标数据源配置id和目标数据的属性生成目标数据Data的目标数据标识data_id和各目标数据切分单元的目标单元标识Sdata_id。

S2.1 切分目标数据Data:

(1)根据目标数据的属性确定目标数据切分单元的属性值Min.length;

(2)通过Length(data)方法计算并获取目标数据的最大属性值MAX.length;

(3)计算并获取目标数据切分单元的数量Count、编号Sdata_id[Count,i]:

如果MAX.length除以Min.length的余数不为零,则

Count = MAX.length/Min.length+1;

Sdata_id[Count,i] = Sdata_id[MAX.length/Min.length+1 , i];

如果MAX.length除以Min.length的余数为零,则

Count = MAX.length/Min.length;

Sdata_id[Count,i] = Sdata_id[MAX.length/Min.length , i];

其中1≤i≤Count。

(4)确定切分方式。

数据切分方式为,目标数据Data将被切分为Count个目标数据切分单元,各目标数据切分单元的编号Sdata_id分别为Sdata_id[Count,1],Sdata_id[Count,2],……,Sdata_id[Count, Count-1]和Sdata_id[Count, Count]。

(5)按(4)中的切分方式对目标数据Data进行切分,获得目标数据切分单元的目标单元数据Sdata_id[Count,i].Data。

S2.2 缓存目标单元数据Sdata_id[Count,i].Data,并生成目标单元数据的缓存路径Sdata_id[Count,i].URL;

S2.3 根据缓存路径Sdata_id[Count,i].URL,获取每个目标数据切分单元的数据字节Sdata_id[Count,i].Bytes,并通过预设标识计算函数func DataFLieMD5(flie:Sdata_id[Count,i].URL),计算获得目标单元标识Sdata_id。

其中,预设标识计算函数DataFLieMD5(flie:Sdata_id[Count,i].URL)的具体过程如表1所示。

表1

目标单元标识Sdata_id[Count,i].id的示例如表2所示。

表2

Sdata_id[Count,i].id=Sdata_id[Count,1].id+Sdata_id[Count,2].id +Sdata_id[Count,3].id+……+Sdata_id[Count,Count-1].id+Sdata_id[Count, Count].id;

例如:Sdata_id[Count,i].id = A + B + …… + C + Y + Z。

S2.4 根据目标数据源配置id和目标单元标识Sdata_id[Count,i].id获得目标数据标识data_id,其中,data_id =目标数据源配置id+Sdata_id[Count,i].id;

例如:data_id =目标数据源配置id + A + B + C +……+ Y + Z。

S3.根据目标数据标识data_id和目标单元标识Sdata_id[Count,i].id判断是否有该目标数据存在,如果存在,则直接将租户名称tenant_name和目标数据标识data_id关联到租户数据关联表并将目标数据标识data_id和目标单元标识Sdata_id[Count,i].id关联到共享数据存储表即可;

如果不存在,则将目标单元标识Sdata_id[Count,i].id存储到共享数据表里,将目标数据标识data_id存储到对应的共享数据存储表里,然后将租户名称tenant_name和目标数据标识data_id关联到租户数据关联表并将目标数据标识data_id和目标单元标识Sdata_id[Count,i].id关联到共享数据存储表,并存储目标数据。

存储目标数据的具体过程如下:

第一步:判断数据源配置id是否相同,即将目标数据源配置id与共享数据存储表各数据源配置id进行比对。

如果不存在相同的数据源配置id,则直接将目标单元标识Sdata_id[Count,i].id存储到共享数据表里,将目标数据标识data_id存储到对应的共享数据存储表里,然后关联目标数据标识data_id和租户名称tenant_name到租户数据关联表里,并将各目标单元数据Sdata_id[Count,i].Data全部进行存储;

如果存在相同的数据源配置id,则进行第二步。

第二步:数据源配置id相同,则将每个目标单元标识Sdata_id[Count,i].id,与同一数据源配置id的共享数据表[Sdata_id,data]中的单元标识Sdata_id进行一一比对,比对完成后:

如果目标单元标识Sdata_id[Count,i].id与该数据源配置id的共享数据表中的单元标识均相同,则直接将租户名称tenant_name和目标数据标识data_id关联到租户数据关联表并将目标数据标识data_id和目标单元标识Sdata_id[Count,i].id关联到共享数据存储表即可;

如果目标单元标识Sdata_id[Count,i].id与的共享数据表中的单元标识均不相同或部分相同,则获取所有的不相同的数据切分单元编号Sdata_id[Count,i]和对应的数据切分单元标识Sdata_id[Count,i].id,并根据数据切分单元编号Sdata_id[Count,i],存储对应的目标单元数据Sdata_id[Count,i].Data,然后将目标单元标识Sdata_id[Count,i].id存储到共享数据表里,将目标数据标识data_id存储到对应的共享数据存储表里,同时将租户名称tenant_name和目标数据标识data_id关联到租户数据关联表并将目标数据标识data_id和目标单元标识Sdata_id[Count,i].id关联到共享数据存储表。

S4. 当租户需要查询该目标数据时,通过租户数据关联表、共享数据存储表和共享数据表里关联的tenant_name、data_id和Sdata_id获取目标数据,并将目标数据返回租户。

本申请实施例还提出了一种多租户共享数据的处理系统,应用于包括租户数据关联表、共享数据存储表和共享数据表的数据库中,如图3所示,所述系统包括:

生成模块10,用于当接收到租户发送的与目标数据源配置id对应的目标数据时,根据所述目标数据源配置id和所述目标数据的属性生成所述目标数据的目标数据标识和各目标数据切分单元的目标单元标识,其中,各所述目标数据切分单元是根据所述属性切分所述目标数据后生成的;

存储模块20,用于根据所述目标数据标识和各所述目标单元标识判断数据库中是否存在所述目标数据,若数据库中不存在所述目标数据,将所述目标单元标识存储到所述共享数据表,将所述目标数据标识存储到所述共享数据存储表,进行预设关联操作并存储所述目标数据;

获取模块30,用于当接收到租户对所述目标数据的查询请求时,根据租户的租户名称、所述租户数据关联表、所述共享数据存储表和所述共享数据表获取所述目标数据,并将所述目标数据返回租户;

其中,所述租户数据关联表表征了租户名称和所述目标数据标识所属的数据标识的关联关系,所述共享数据存储表表征了数据标识、所述目标单元标识所属的单元标识和所述目标数据源配置id所属的数据源配置id的关联关系,所述共享数据表表征了单元标识和所述目标数据所属的真实数据的关联关系,数据源配置id由数据源IP地址和端口号生成,所述预设关联操作为将租户名称和所述目标数据标识关联到所述租户数据关联表并将所述目标数据标识和所述目标单元标识关联到所述共享数据存储表。

在具体的应用场景中,存储模块20还用于:

若数据库中已存在所述目标数据,进行所述预设关联操作。

在具体的应用场景中,生成模块10,具体用于:

根据所述属性切分所述目标数据并获取各所述目标数据切分单元的目标单元数据;

缓存各所述目标单元数据并生成各所述目标单元数据的缓存路径;

根据所述缓存路径获取各所述目标单元数据的数据字节,并按预设标识计算函数对所述数据字节处理后生成各所述目标单元标识;

根据所述目标数据源配置id和各所述目标单元标识生成所述目标数据标识。

在具体的应用场景中,生成模块10,还具体用于:

根据所述属性确定各所述目标数据切分单元的属性值Min.length;

调用Length()函数计算并获取所述目标数据的最大属性值MAX.length;

若MAX.length除以Min.length的余数不为零,则所述目标数据切分单元的数量Count=MAX.length/Min.length+1,所述目标数据切分单元的编号Sdata_id[Count,i]=Sdata_id[MAX.length/Min.length+1 , i];

若MAX.length除以Min.length的余数为零,则Count=MAX.length/Min.length,Sdata_id[Count,i]=Sdata_id[MAX.length/Min.length , i];

按Count和Sdata_id[Count,i]切分所述目标数据,获取Count个目标单元数据Sdata_id[Count,i].Data;

其中1≤i≤Count。

在具体的应用场景中,存储模块20,还具体用于:

若所述共享数据存储表中不存在与所述目标数据源配置id相同的数据源配置id,将各所述目标单元标识存储到所述共享数据表,将所述目标数据标识存储到所述共享数据存储表,将所述目标数据标识和用户名称关联到所述租户数据关联表,并将各所述目标单元数据进行存储;

若所述共享数据存储表中存在与所述目标数据源配置id相同的数据源配置id,且所述目标数据源配置id下的所述共享数据表中存在分别与各所述目标单元标识相同的单元标识,进行所述预设关联操作;

若所述共享数据存储表中存在与所述目标数据源配置id相同的数据源配置id,且各所述目标单元标识与所述目标数据源配置id下的所述共享数据表中的单元标识均不相同或一部分相同,根据不相同的目标数据切分单元的编号将对应的不相同的目标单元数据存储,并将所述目标单元标识存储到所述共享数据表,将所述目标数据标识存储到所述共享数据存储表,并进行所述预设关联操作。

最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不驱使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。

技术分类

06120114709500