MySQL:SQL Server HierarchyId数据类型的备用解决方案

时间:2014-07-02 07:46:22

标签: mysql sql sql-server hierarchy hierarchyid

我当前的应用程序是在SQL Server 2008 JAVA Hibernate HierarchyId中的n-Level服务器中构建的,我在数据库中使用了SQL Server 2008数据类型作为部门层次结构。

我编写了SQL查询来处理HierarchyId数据类型。我也有MySQL部门树结构。

现在,我想根据业务需求将我的数据库服务器从HierarchyId更改为HierarchyId

在进行可行性检查后,我找到了解决方案,我的整个应用程序将迁移到除{{1}}数据类型之外的MySQL数据库服务器。

因此,我的主要挑战是找到{{1}}数据类型的替代解决方案,而编码的变化极小。

在我的数据库中实施部门层次结构的最佳方法是什么?

...谢谢

2 个答案:

答案 0 :(得分:4)

当我们的团队决定从MS-SQL迁移到MySQL时,我遇到了类似的情况。我们使用以下步骤解决了该问题:

  1. 在MS SQL中向同一个表中添加了一个varchar(100)类型的列。
  2. 使用hierarchyid.ToString()函数将hierarchyid从十六进制值转换为字符串,并使用计算列功能将其保存在新创建的列中。例如。 0x58 - > “/ 1 /”,0x7CE0 - > “/ 3/7 /".
  3. 实体的等级等于'/'的减去-1。
  4. 这些列可以迁移到MySQL。
  5. IsDesendantOf()和is方法被替换为带有'%'的字符串的LIKE函数。
  6. 因此我们摆脱了MySQL中的hierarchyid功能。

    每当我们遇到这样的问题时,我们只需要问问自己,如果我们使用的工具不提供此功能,我们会做些什么。我们通常最终得到最佳答案。

答案 1 :(得分:1)

Mysql没有我所知的等效内容,但您可以将相同的数据存储在varchar中。

对于涉及HierarchyId的操作,您可能必须自己实现它们,可能是用户定义的函数或存储过程。

sqlserver看起来像"物化路径"存储层次结构的方法。可以在http://www.cloudconnected.fr/2009/05/26/trees-in-sql-an-approach-based-on-materialized-paths-and-normalization-for-mysql/

看到mysql中的一个示例