有大约500,000条记录,我想为之前的航班找到Onward航班。一个例子就是这样:
Flight 1 Rodez - Beziers
Flight 2 Beziers - Biarritz
Flight 3 Biarritz - Rodez
Flight 4 Blois - Montauban
现在从上面我们可以发现Flight 1
的前方是Flight 2
。类似地,Flight 2
的前方是Flight 3
而Flight 4
没有前进,它本身也不是任何一个。
我可以使用Graphs在C#中执行此操作,但我不知道如何处理如此多的数据(500,000条记录)。或者,如果我在SQL中执行此操作,我该如何处理它?注意我不想要一个我想知道的完整实现:
- 首先 - 我是否应该在C#或SQL中执行此操作,因为性能是一个问题。
- 第二 - 如何在没有任何数据结构的情况下在SQL中实现此算法,如图。
醇>
答案 0 :(得分:0)
基本上,你在这里拥有的是ORIGIN和DEST(INATION)。
我首先要获取未出现在DEST列中的所有ORIGIN的列表。这些不是转发航班,所以我们称之为STARTP(OINTS)。
SQL解决方案:
对于STARTP中的每一个,将其设置为锚点,然后运行递归语句,该语句将连接前进航班(在任何ORIGIN记录中查找先前的DEST值)。
答案 1 :(得分:0)
我是否应该在C#或SQL中执行此操作,因为性能是一个问题
SQL比代码处理更快,因为它只是对静态数据的逻辑访问。您应该在SQL中明确地模拟您的问题。 这意味着,您还应该使用stored procedures来快速执行定期查询。
如何在没有任何数据结构的情况下在SQL中实现此算法,如Graph
如果您还没有数据库,请创建一个可以模拟问题的数据库。例如,如果我是你,我会有一个表:
***** FLIGHT *****
FLIGHT_Id FLIGHT_cityBegin FLIGHT_cityEnd
1 Rodez Beziers
2 Beziers Biarritz
知道前飞航班的存储程序如下:
USE [your_database_name]
GO
CREATE PROCEDURE your_procedure_name
@sql_flight_id int
AS
DECLARE @sql_return int
SELECT @sql_return = FLIGHT_Id
FROM [dbo].[FLIGHT]
WHERE FLIGHT_cityEnd = (SELECT FLIGHT_cityBegin
FROM [dbo].[FLIGHT]
WHERE FLIGHT_Id = @sql_flight_id)
RETURN 0
并在服务器端(C#)使用此存储过程:
protected int getFlightOnward(int flightId)
{
int id_flight_onward = -1;
string connection_string = /* get database infos */;
SqlConnection con = new SqlConnection(connection_string);
try
{
con.Open();
SqlCommand com = new SqlCommand("your_procedure_name", con);
com.CommandType = CommandType.StoredProcedure;
com.Parameters.Add(new SqlParameter("@sql_flight_id", flightId);
SqlParameter return_value = com.Parameters.Add("@sql_return", SqlDbType.Int);
return_value.Direction = ParameterDirection.Output;
com.ExecuteNonQuery();
id_flight_onward = int.Parse(com.Parameters["@sql_return"].Value.ToString());
}
catch
{
con.Close();
}
return id_flight_onward;
}
如果未找到任何航班,则上述函数返回-1
,否则它将返回航班的ID。