Hierarchyid数据类型

Jun 07, 2016 pm 02:56 PM
関係 私たち データ データベース タイプ

以往我们在关系数据库中建立树状结构的时候,通常使用ID+ParentID来实现两条 纪录间的父子关系。但这种方式只能标示其相对位置。解决这类问题在SqlServer2005出现之前通常是采用游标来操作,但熟悉数据库内部机制的人都 知道使用游标带来的性能问题和其他问

以往我们在关系数据库中建立树状结构的时候,通常使用ID+ParentID来实现两条 纪录间的父子关系。但这种方式只能标示其相对位置。解决这类问题在SqlServer2005出现之前通常是采用游标来操作,但熟悉数据库内部机制的人都 知道使用游标带来的性能问题和其他问题是比较严重的。

到了SqlServer2005下,可以选择用CTE来做递归查询,这种方式查询比 较简练,但由于数据库内部是采用递归查询的方式,其效率依旧不高;为了能够实现既简练又高效的查询,通常的做法是增加冗余字段,比如增加一个"Path" 字段,查询时用模糊查询来进行左匹配。对Path建索引后,这种查询的效率还是相当高的,因此这种方式也是一种常规的设计方式;

SQL SERVER 2008引入了新的hierarchyid数据类型,可以用它来做本地存储并且在树层次结构中管理其位置.只用这个函数能简洁地表示层次结构中的位置.该 函数提供的一些内置的函数方法可以操作和遍历层次结构,使得存储和查询分层数据更为容易,而不需要像那样通过CTE递归来获得.

Hierarchyid类型其实是一个CLR自定义数据类型依次打开:数据库->系统数据库->master->可编程性->类型->系统数据类型->CLR数据类型->hierarchyid,可以看到该数据类型.

于hierarchyid有关的一些函数主要有:

  • GetAncestor :取得某一个级别的祖先
  • GetDescendant :取得某一个级别的子代
  • GetLevel :取得级别
  • GetRoot :取得根
  • IsDescendantOf :判断某个节点是否为某个节点的子代
  • Parse :将字符串转换为hierarchyid。该字符串的格式通常都是/1/这样的
  • Read :Read 从传入的BinaryReader 读取SqlHierarchyId 的二进制表示形式,并将SqlHierarchyId 对象设置为该值。不能使用Transact-SQL 调用Read。请改为使用CAST 或CONVERT。
  • GetReparentedValue :可以用来移动节点(或者子树)
  • ToString :将hierarchyid转换为字符串,与parse正好相反
  • Write : 将SqlHierarchyId 的二进制表示形式写出到传入的BinaryWriter 中。无法通过使用Transact-SQL 来调用Write。请改为使用CAST 或CONVERT。

hierarchyid 数据类型的值表示树层次结构中的位置。hierarchyid 的值具有以下属性:

  • 非常紧凑

    在具有 n 个节点的树中,表示一个节点所需的平均位数取决于平均端数(节点的平均子级数)。端数较小时 (0-7),大小约为 6*logAn 位,其中 A 是平均端数。对于平均端数为 6 级、包含 100,000 个人的组织层次结构,一个节点大约占 38 位。存储时,此值向上舍入为 40 位,即 5 字节。

  • 按深度优先顺序进行比较

    给定两个 hierarchyid 值 aba 表示在对树进行深度优先遍历时,先找到 a,后找到 b。hierarchyid 数据类型的索引按深度优先顺序排序,在深度优先遍历中相邻的节点的存储位置也相邻。例如,一条记录的子级的存储位置与该记录的存储位置是相邻的。

  • 支持任意插入和删除

    通过使用 GetDescendant 方法,始终可以在任意给定节点的右侧、左侧或任意两个同级节点之间生成同级节点。在层次结构中插入或删除任意数目的节点时,该比较属性保持不变。大多数插 入和删除操作都保留了紧凑性属性。但是,对于在两个节点之间执行的插入操作,所产生的 hierarchyid 值的表示形式在紧凑性方面将稍微降低。

hierarchyid 数据类型具有以下局限性:

  • 类 型为 hierarchyid 的列不会自动表示树。由应用程序来生成和分配 hierarchyid 值,使行与行之间的所需关系反映在这些值中。一些应用程序甚至可能不需要用类型为 hierarchyid 的列来表示树。可能这些值为对其他表中定义的层次结构中位置的引用。

  • 由应用程序来管理生成和分配 hierarchyid 值时的并发情况。不能保证列中的 hierarchyid 值是唯一的,除非应用程序使用唯一键约束或应用程序自身通过自己的逻辑来强制实现唯一性。

  • 由 hierarchyid 值表示的层次结构关系不是像外键关系那样强制实现的。可能会出现下面这种层次结构关系而且有时这种关系是合理的:A 具有子级 B,然后删除了 A,导致 B 与一条不存在的记录之间存在关系。如果这种行为不可接受,应用程序在删除父级之前必须先查询其是否有后代。

用于对分层数据进行索引的策略有两种:

  • 深度优先

    深度优先索引,子树中各行的存储位置相邻。例如,一位经理管理的所有雇员都存储在其经理的记录附近。

Nodes are stored together.
  • 广度优先

    广度优先将层次结构中每个级别的各行存储在一起。例如,同一经理直属的各雇员的记录存储在相邻位置。

Each hierarchy level is stored together.

例如下面的例子是一个职员表,数据有如下关系:

Scott

|

Mark Ravi

| |

Ben Laura Vijay Frank James

<span>Use</span> AdventureWorksLT <span>Go</span> --Scheme Creation <span>Create</span> <span>Schema</span> HumanResources <span>Go</span> --<span>Table</span> Creation <span>CREATE</span> <span>TABLE</span> HumanResources.EmployeeDemo 
(
OrgNode HIERARCHYID,
EmployeeID <span>INT</span>,
LoginID <span>VARCHAR</span>(100),
Title <span>VARCHAR</span>(200),
HireDate DATETIME
) <span>Go</span> --<span>Index</span> Creation <span>CREATE</span> <span>UNIQUE</span> <span>CLUSTERED</span> <span>INDEX</span> idxEmployeeDemo <span>ON</span> HumanResources.EmployeeDemo (OrgNode,EmployeeID)
ログイン後にコピー
下面插入一些数据
SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate)  
LUES (hierarchyid::GetRoot(), 1,<span>'adventure-works\scott'</span>, <span>'CEO'</span>, <span>'3/11/05'</span>) ; 
      
CLARE @Manager hierarchyid    
LECT @Manager = hierarchyid::GetRoot() <span>FROM</span> HumanResources.EmployeeDemo; 
SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate)     
LUES (@Manager.GetDescendant(<span>NULL</span>,<span>NULL</span>), 2, <span>'adventure-works\Mark'</span>, <span>'CTO'</span>, <span>'4/05/07'</span>)       
 


CLARE @Manager hierarchyid 
CLARE @FirstChild hierarchyid  
LECT @Manager = hierarchyid::GetRoot() <span>FROM</span> HumanResources.EmployeeDemo; 
lect @FirstChild = @Manager.GetDescendant(<span>NULL</span>,<span>NULL</span>)        
SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate)        
LUES (@Manager.GetDescendant(@FirstChild,<span>NULL</span>), 3, <span>'adventure-works\ravi'</span>, <span>'Director Marketing'</span>, <span>'4/08/07'</span>)        

           
Insert the <span>First</span> Descendant <span>of</span> a Child Node    
CLARE @Manager hierarchyid     
LECT @Manager = <span>CAST</span>(<span>'/1/'</span> <span>AS</span> hierarchyid)       
SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate) 
LUES (@Manager.GetDescendant(<span>NULL</span>, <span>NULL</span>),45, <span>'adventure-works\Ben'</span>,<span>'Application Developer'</span>, <span>'6/11/07'</span>) ;         

  
Insert the <span>Second</span> Descendant <span>of</span> a Child Node 
CLARE @Manager hierarchyid        
CLARE @FirstChild hierarchyid         
LECT @Manager = <span>CAST</span>(<span>'/1/'</span> <span>AS</span> hierarchyid)   
LECT @FirstChild = @Manager.GetDescendant(<span>NULL</span>,<span>NULL</span>)    

SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate)      
LUES (@Manager.GetDescendant(@FirstChild, <span>NULL</span>),55, <span>'adventure-works\Laura'</span>,<span>'Trainee Developer'</span>, <span>'6/11/07'</span>) ;           

           
Insert the <span>first</span> node who <span>is</span> the Descendant <span>of</span> Director Marketing      
CLARE @Manager hierarchyid     
CLARE @FirstChild hierarchyid     
LECT @Manager = <span>CAST</span>(<span>'/2/'</span> <span>AS</span> hierarchyid)          

SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate)   
LUES (@Manager.GetDescendant(<span>NULL</span>, <span>NULL</span>),551, <span>'adventure-works\frank'</span>,<span>'Trainee Sales Exec.'</span>, <span>'12/11/07'</span>) ;        

          
Insert the <span>second</span> node who <span>is</span> the Descendant <span>of</span> Director Marketing     
CLARE @Manager hierarchyid           
CLARE @FirstChild hierarchyid        
LECT @Manager = <span>CAST</span>(<span>'/2/'</span> <span>AS</span> hierarchyid)   
LECT @FirstChild = @Manager.GetDescendant(<span>NULL</span>,<span>NULL</span>)
SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate) 
LUES (@Manager.GetDescendant(@FirstChild, <span>NULL</span>),531, <span>'adventure-works\vijay'</span>,<span>'Manager Industrial Sales'</span>, <span>'12/09/06'</span>) ;         

    
Insert the third node who <span>is</span> the Descendant <span>of</span> Director Marketing <span>in</span> <span>between</span> 2 existing descendants    
CLARE @Manager hierarchyid    
CLARE @FirstChild hierarchyid      
CLARE @SecondChild hierarchyid     
LECT @Manager = <span>CAST</span>(<span>'/2/'</span> <span>AS</span> hierarchyid)          
LECT @FirstChild = @Manager.GetDescendant(<span>NULL</span>,<span>NULL</span>)   
LECT @SecondChild = @Manager.GetDescendant(@FirstChild,<span>NULL</span>)   
SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate)  
LUES (@Manager.GetDescendant(@FirstChild, @SecondChild),543, <span>'adventure-works\james'</span>,<span>'Manager Consumer Sales'</span>, <span>'12/04/06'</span>) ;           
ログイン後にコピー

Hierarchyid字段类型提供了一系列相关查询函数,可以方便的查询父子关系数据。下面我们查询下数据
<span>DECLARE</span> @TID hierarchyid <span>SELECT</span> @TID=OrgNode <span>FROM</span> HumanResources.EmployeeDemo <span>WHERE</span> title=<span>'cto'</span> <span>SELECT</span> *, OrgNode.GetLevel() <span>as</span> 层次,OrgNode.ToString() <span>as</span> 路径 <span>FROM</span> HumanResources.EmployeeDemo <span>WHERE</span> @TID.IsDescendantOf(OrgNode)=1 <span>SELECT</span> *, OrgNode.GetLevel() <span>as</span> 层次,OrgNode.ToString() <span>as</span> 路径 <span>FROM</span> HumanResources.EmployeeDemo <span>WHERE</span> OrgNode.IsDescendantOf(@TID)=1 
ログイン後にコピー
 
ログイン後にコピー
ログイン後にコピー
<img src="/static/imghw/default1.png"  data-src="http://www.68idc.cn/help/uploads/allimg/151109/1024114a8-2.png"  class="lazy"  title="image" alt="image"    style="max-width:90%"  style="max-width:90%" /> 
ログイン後にコピー
下面另外附几个操作的存储过程:
  • 向表里插入记录
<span>SET</span> QUOTED_IDENTIFIER <span>ON</span> <span>GO</span> --<span>Use</span> Serializable <span>Transaction</span> <span>CREATE</span> <span>PROCEDURE</span> [dbo].[AddEmployee](@ManagerID hierarchyid, @EmpID <span>int</span>,
@LogID <span>varchar</span>(100), @JobTitle <span>as</span> <span>varchar</span>(200), @JoiningDate datetime) <span>AS</span> <span>BEGIN</span> <span>DECLARE</span> @LastChild hierarchyid <span>SET</span> <span>TRANSACTION</span> <span>ISOLATION</span> <span>LEVEL</span> SERIALIZABLE <span>BEGIN</span> <span>TRANSACTION</span> <span>SELECT</span> @LastChild = <span>Max</span>(OrgNode) <span>From</span> HumanResources.EmployeeDemo <span>WHERE</span> OrgNode = @ManagerID 
INSERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate) <span>VALUES</span>(@LastChild, @EmpID,@LogID , @JobTitle, @JoiningDate) <span>COMMIT</span> <span>END</span> ;
ログイン後にコピー
  • 移动层级关系
    ログイン後にコピー
<span>CREATE</span> <span>PROCEDURE</span> MoveOrg(@oldMgr nvarchar(256), @newMgr nvarchar(256) ) <span>AS</span> <span>BEGIN</span> <span>DECLARE</span> @nold HierarchyID <span>DECLARE</span> @nnew HierarchyID <span>SELECT</span> @nold = OrgNode <span>FROM</span> HumanResources.EmployeeDemo <span>WHERE</span> LoginID = @oldMgr ; <span>SET</span> <span>TRANSACTION</span> <span>ISOLATION</span> <span>LEVEL</span> SERIALIZABLE <span>BEGIN</span> <span>TRANSACTION</span> <span>SELECT</span> @nnew = OrgNode <span>FROM</span> HumanResources.EmployeeDemo <span>WHERE</span> LoginID = @newMgr ; <span>SELECT</span> @nnew = @nnew.GetDescendant(<span>max</span>(OrgNode), <span>NULL</span>) <span>FROM</span> HumanResources.EmployeeDemo <span>WHERE</span> OrgNode.GetAncestor(1)=@nnew ; <span>UPDATE</span> HumanResources.EmployeeDemo <span>SET</span> OrgNode = OrgNode.GetReparentedValue(@nold, @nnew) <span>WHERE</span> @nold.IsDescendantOf(OrgNode) = 1 <span>COMMIT</span> <span>TRANSACTION</span> <span>END</span> 
ログイン後にコピー

  • 获取最大的子节点,传递给GetDescendant() 函数获得新的子节点
<span>Create</span> <span>Function</span> GetMyMaxChild(@ManagerID <span>as</span> BigInt) <span>Returns</span> HierarchyID <span>BEGIN</span> <span>Declare</span> @ManagerNode HierarchyID <span>Declare</span> @MaxChild HierarchyID 
 --<span>Get</span> the ManagerNode <span>Select</span> @ManagerNode = OrgNode <span>from</span> HumanResources.EmployeeDemo <span>Where</span> EmployeeID = @ManagerID 
 --<span>Get</span> the <span>Max</span> Child <span>Select</span> @MaxChild = <span>Max</span>(OrgNode) <span>from</span> HumanResources.EmployeeDemo <span>Where</span> OrgNode.GetAncestor(1) = @ManagerNode 
--<span>Return</span> the <span>Value</span> <span>RETURN</span> @MaxChild <span>END</span> 
ログイン後にコピー
 
ログイン後にコピー
ログイン後にコピー
http://msdn.microsoft.com/zh-cn/library/bb677173.aspx
ログイン後にコピー

http://nibblersrevenge.cluss.de/archive/2009/05/31/how-to-use-hierarchyid-in-linqtosql-or-entity-framework-mssql.aspx

http://www.cnblogs.com/downmoon/archive/2011/05/03/2035259.html

<无>
Use AdventureWorksLT 
Go  
--Scheme Creation 
Create Schema HumanResources 
Go  
--Table Creation 
CREATE TABLE HumanResources.EmployeeDemo 
(
OrgNode HIERARCHYID,
EmployeeID INT,
LoginID VARCHAR(100),
Title VARCHAR(200),
HireDate DATETIME
)
Go 
--Index Creation 
CREATE UNIQUE CLUSTERED INDEX idxEmployeeDemo 
ON HumanResources.EmployeeDemo (OrgNode,EmployeeID)
ログイン後にコピー
SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate)  
LUES (hierarchyid::GetRoot(), 1,'adventure-works\scott', 'CEO', '3/11/05') ; 
      
CLARE @Manager hierarchyid    
LECT @Manager = hierarchyid::GetRoot() FROM HumanResources.EmployeeDemo; 
SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate)     
LUES (@Manager.GetDescendant(NULL,NULL), 2, 'adventure-works\Mark', 'CTO', '4/05/07')       
 


CLARE @Manager hierarchyid 
CLARE @FirstChild hierarchyid  
LECT @Manager = hierarchyid::GetRoot() FROM HumanResources.EmployeeDemo; 
lect @FirstChild = @Manager.GetDescendant(NULL,NULL)        
SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate)        
LUES (@Manager.GetDescendant(@FirstChild,NULL), 3, 'adventure-works\ravi', 'Director Marketing', '4/08/07')        

           
Insert the First Descendant of a Child Node    
CLARE @Manager hierarchyid     
LECT @Manager = CAST('/1/' AS hierarchyid)       
SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate) 
LUES (@Manager.GetDescendant(NULL, NULL),45,   'adventure-works\Ben','Application Developer', '6/11/07') ;         

  
Insert the Second Descendant of a Child Node 
CLARE @Manager hierarchyid        
CLARE @FirstChild hierarchyid         
LECT @Manager = CAST('/1/' AS hierarchyid)   
LECT @FirstChild = @Manager.GetDescendant(NULL,NULL)    

SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate)      
LUES (@Manager.GetDescendant(@FirstChild, NULL),55,  'adventure-works\Laura','Trainee Developer', '6/11/07') ;           

           
Insert the first node who is the Descendant of Director Marketing      
CLARE @Manager hierarchyid     
CLARE @FirstChild hierarchyid     
LECT @Manager = CAST('/2/' AS hierarchyid)          

SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate)   
LUES (@Manager.GetDescendant(NULL, NULL),551, 'adventure-works\frank','Trainee Sales Exec.', '12/11/07') ;        

          
Insert the second node who is the Descendant of Director Marketing     
CLARE @Manager hierarchyid           
CLARE @FirstChild hierarchyid        
LECT @Manager = CAST('/2/' AS hierarchyid)   
LECT @FirstChild = @Manager.GetDescendant(NULL,NULL)
SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate) 
LUES (@Manager.GetDescendant(@FirstChild, NULL),531, 'adventure-works\vijay','Manager Industrial Sales', '12/09/06') ;         

    
Insert the third node who is the Descendant of Director Marketing        
in between 2 existing descendants    
CLARE @Manager hierarchyid    
CLARE @FirstChild hierarchyid      
CLARE @SecondChild hierarchyid     
LECT @Manager = CAST('/2/' AS hierarchyid)          
LECT @FirstChild = @Manager.GetDescendant(NULL,NULL)   
LECT @SecondChild = @Manager.GetDescendant(@FirstChild,NULL)   
SERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate)  
LUES (@Manager.GetDescendant(@FirstChild, @SecondChild),543,  'adventure-works\james','Manager Consumer Sales', '12/04/06') ;
ログイン後にコピー
DECLARE @TID hierarchyid 
SELECT @TID=OrgNode FROM HumanResources.EmployeeDemo  WHERE title='cto' 

SELECT *, OrgNode.GetLevel() as 层次,OrgNode.ToString() as 路径  FROM HumanResources.EmployeeDemo WHERE @TID.IsDescendantOf(OrgNode)=1 

SELECT *, OrgNode.GetLevel() as 层次,OrgNode.ToString() as 路径  FROM HumanResources.EmployeeDemo WHERE  OrgNode.IsDescendantOf(@TID)=1 
ログイン後にコピー
SET QUOTED_IDENTIFIER ON
GO
--Use Serializable Transaction 
CREATE PROCEDURE [dbo].[AddEmployee](@ManagerID hierarchyid, @EmpID int,
@LogID varchar(100), @JobTitle as varchar(200), @JoiningDate datetime)
AS 
BEGIN 

DECLARE @LastChild hierarchyid 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
BEGIN TRANSACTION
SELECT @LastChild = Max(OrgNode) From HumanResources.EmployeeDemo 
WHERE OrgNode = @ManagerID 
INSERT HumanResources.EmployeeDemo (OrgNode, EmployeeID, LoginID, Title, HireDate) 
VALUES(@LastChild, @EmpID,@LogID , @JobTitle, @JoiningDate) 
COMMIT 
END ;
ログイン後にコピー
CREATE PROCEDURE MoveOrg(@oldMgr nvarchar(256), @newMgr nvarchar(256) ) 
AS 
BEGIN

DECLARE @nold HierarchyID 
DECLARE @nnew HierarchyID 

SELECT @nold = OrgNode FROM HumanResources.EmployeeDemo WHERE LoginID = @oldMgr ; 

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 

BEGIN TRANSACTION 
SELECT @nnew = OrgNode FROM HumanResources.EmployeeDemo WHERE LoginID = @newMgr ; 
SELECT @nnew = @nnew.GetDescendant(max(OrgNode), NULL) 
FROM HumanResources.EmployeeDemo WHERE OrgNode.GetAncestor(1)=@nnew ; 
UPDATE HumanResources.EmployeeDemo 
SET OrgNode = OrgNode.GetReparentedValue(@nold, @nnew) 
WHERE @nold.IsDescendantOf(OrgNode) = 1
 
COMMIT  TRANSACTION
END
ログイン後にコピー
Create Function GetMyMaxChild(@ManagerID as BigInt) Returns HierarchyID 
BEGIN 

Declare @ManagerNode HierarchyID 
Declare @MaxChild HierarchyID 
 --Get the ManagerNode 
Select @ManagerNode = OrgNode from 
HumanResources.EmployeeDemo Where EmployeeID = @ManagerID 
 --Get the Max Child 

Select @MaxChild = Max(OrgNode) from HumanResources.EmployeeDemo 
Where OrgNode.GetAncestor(1) = @ManagerNode 
--Return the Value 

RETURN @MaxChild 
END 
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

アメリカ空軍が初のAI戦闘機を公開し注目を集める!大臣はプロセス全体を通じて干渉することなく個人的にテストを実施し、10万行のコードが21回にわたってテストされました。 アメリカ空軍が初のAI戦闘機を公開し注目を集める!大臣はプロセス全体を通じて干渉することなく個人的にテストを実施し、10万行のコードが21回にわたってテストされました。 May 07, 2024 pm 05:00 PM

最近、軍事界は、米軍戦闘機が AI を使用して完全自動空戦を完了できるようになったというニュースに圧倒されました。そう、つい最近、米軍のAI戦闘機が初めて公開され、その謎が明らかになりました。この戦闘機の正式名称は可変安定性飛行シミュレーター試験機(VISTA)で、アメリカ空軍長官が自ら飛行させ、一対一の空戦をシミュレートした。 5 月 2 日、フランク ケンダル米国空軍長官は X-62AVISTA でエドワーズ空軍基地を離陸しました。1 時間の飛行中、すべての飛行動作が AI によって自律的に完了されたことに注目してください。ケンダル氏は「過去数十年にわたり、私たちは自律型空対空戦闘の無限の可能性について考えてきたが、それは常に手の届かないものだと思われてきた」と語った。しかし今では、

AI スタートアップ企業は一斉に OpenAI に転職し、イリヤが去った後にセキュリティ チームが再編成されました。 AI スタートアップ企業は一斉に OpenAI に転職し、イリヤが去った後にセキュリティ チームが再編成されました。 Jun 08, 2024 pm 01:00 PM

先週、社内の辞任と社外からの批判が相次ぐ中、OpenAIは内外のトラブルに見舞われた。 - 未亡人姉妹への侵害が世界中で白熱した議論を巻き起こした - 「覇権条項」に署名した従業員が次々と暴露 - ネットユーザーがウルトラマンの「」をリストアップ噂の払拭: Vox が入手した漏洩情報と文書によると、アルトマンを含む OpenAI の上級幹部はこれらの株式回収条項をよく認識しており、承認しました。さらに、OpenAI には、AI セキュリティという深刻かつ緊急の課題が直面しています。最近、最も著名な従業員2名を含むセキュリティ関連従業員5名が退職し、「Super Alignment」チームが解散したことで、OpenAIのセキュリティ問題が再び注目を集めている。フォーチュン誌は OpenA を報じた。

iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます Jul 18, 2024 am 05:48 AM

Apple の最新リリースの iOS18、iPadOS18、および macOS Sequoia システムでは、さまざまな理由で紛失または破損した写真やビデオをユーザーが簡単に回復できるように設計された重要な機能が写真アプリケーションに追加されました。この新機能では、写真アプリのツール セクションに「Recovered」というアルバムが導入され、ユーザーがデバイス上に写真ライブラリに含まれていない写真やビデオがある場合に自動的に表示されます。 「Recovered」アルバムの登場により、データベースの破損、カメラ アプリケーションが写真ライブラリに正しく保存されない、または写真ライブラリを管理するサードパーティ アプリケーションによって失われた写真やビデオに対する解決策が提供されます。ユーザーはいくつかの簡単な手順を実行するだけで済みます

PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル Jun 04, 2024 pm 01:42 PM

MySQLi を使用して PHP でデータベース接続を確立する方法: MySQLi 拡張機能を含める (require_once) 接続関数を作成する (functionconnect_to_db) 接続関数を呼び出す ($conn=connect_to_db()) クエリを実行する ($result=$conn->query()) 閉じる接続 ( $conn->close())

PHP でデータベース接続エラーを処理する方法 PHP でデータベース接続エラーを処理する方法 Jun 05, 2024 pm 02:16 PM

PHP でデータベース接続エラーを処理するには、次の手順を使用できます。 mysqli_connect_errno() を使用してエラー コードを取得します。 mysqli_connect_error() を使用してエラー メッセージを取得します。これらのエラー メッセージをキャプチャしてログに記録することで、データベース接続の問題を簡単に特定して解決でき、アプリケーションをスムーズに実行できるようになります。

70B モデルは数秒で 1,000 トークンを生成、コード書き換えは GPT-4o を超える、OpenAI が投資したコード成果物である Cursor チームによる 70B モデルは数秒で 1,000 トークンを生成、コード書き換えは GPT-4o を超える、OpenAI が投資したコード成果物である Cursor チームによる Jun 13, 2024 pm 03:47 PM

70B モデルでは、数秒で 1,000 個のトークンを生成でき、これはほぼ 4,000 文字に相当します。研究者らは Llama3 を微調整し、高速化アルゴリズムを導入しました。ネイティブ バージョンと比較して、速度は 13 倍高速になりました。速いだけでなく、コード書き換えタスクのパフォーマンスは GPT-4o をも上回ります。この成果は、人気の AI プログラミング成果物 Cursor を開発したチーム、anysphere によるもので、OpenAI も投資に参加しました。有名な高速推論アクセラレーション フレームワークである Groq では、70BLlama3 の推論速度は 1 秒あたり 300 トークンを超える程度であることを知っておく必要があります。 Cursor の速度により、ほぼ瞬時に完全なコード ファイル編集を実現すると言えます。カースと言うと良い奴だと言う人もいる

チャイナモバイル:人類は第4次産業革命を迎え、「3つの計画」を正式発表 チャイナモバイル:人類は第4次産業革命を迎え、「3つの計画」を正式発表 Jun 27, 2024 am 10:29 AM

6月26日のニュースによると、2024年世界移動通信会議上海(MWC上海)の開会式で、チャイナモバイル会長の楊潔氏がスピーチを行った。現在、人類社会は情報が支配し、情報とエネルギーが深く融合する第4次産業革命、すなわち「デジタルインテリジェンス革命」を迎えており、新たな生産力の形成が加速していると述べた。楊潔氏は、蒸気機関による「機械化革命」から、電気や内燃機関による「電化革命」、コンピューターやインターネットによる「情報革命」に至るまで、各段階の産業革命は、 「情報」と「エネルギー」が生産性向上をもたらす幹線

Golangでデータベースコールバック関数を使用するにはどうすればよいですか? Golangでデータベースコールバック関数を使用するにはどうすればよいですか? Jun 03, 2024 pm 02:20 PM

Golang でデータベース コールバック関数を使用すると、次のことを実現できます。 指定されたデータベース操作が完了した後にカスタム コードを実行します。追加のコードを記述せずに、個別の関数を通じてカスタム動作を追加します。コールバック関数は、挿入、更新、削除、クエリ操作に使用できます。コールバック関数を使用するには、sql.Exec、sql.QueryRow、または sql.Query 関数を使用する必要があります。

See all articles