如何理解已经开发的数据库?

时间:2012-06-19 16:19:40

标签: sql foxpro

我的问题可能看起来有点奇怪,但我相信大多数人可能已经度过了这个阶段。

我目前正在开发数据库迁移项目(从FoxPro到SQL Server)。正在迁移的数据库非常庞大,我是这个项目的新手。有没有简单的方法来理解这样的数据库?就像表格如何相关以及如何建模一样。此数据库上没有适当的文档。

我认为了解它是如何构建的,可以更容易地编写新的查询/存储过程。只是好奇知道任何捷径。

感谢。

8 个答案:

答案 0 :(得分:18)

我实际上希望你在这里找不到多少答案,因为我的职业生涯基于这些大型无证数据模型,并试图找出它们。但是为了它的价值:

  • 我不喜欢自动数据建模器/电子建模器,尽管这可能是个人观点。我的偏好是找到白板(或纸)并手工绘制您的数据模型。如果你是一个kinaesthetic学习者(通过亲自参与学习),我发现这是熟悉新数据库的最好方法......就像自动化系统读取数据库一样好,你不会了解手工绘制时的意思。

  • 数据建模技术数量有限,但可以通过多种方式进行组合。我猜你有一个像你这样的大型数据库,你将有多个程序员创建它,这意味着你可能会看到同一个数据库中使用的多种技术。在过去,我发现了一个系统,它将电路信息存储为一个单独的表,自动连接到自身,以存储数据电路的信息,而客户信息部分是一个非常直接的明星设计...... 2非常独立编程风格,可能是两个独立的开发者我后来冒险进入应用程序的电话电路部分,我立刻认识到与数据电路部分相同的风格(可能是相同的程序员)。通常情况下,开发人员将被分配到与您业务的某个部分相关的逻辑部门......请注意类似部分中的模式。

  • 物理数据库结构只是一个要理解的部分......在左边(数据库之前)是如何生成数据并将其加载到数据库中(数据仓库?)。了解您的数据是什么以及如何创建数据是在数据库加载后知道您在寻找数据的第一步。

  • 在上面的相反方面,数据在数据库中之后...了解数据的消耗方式(由用户使用)将有助于您了解他们从中获取的数据以及他们需要的内容它。如果您可以使用脚本编写生成现有报告的额外点,因为from语句将帮助您了解如何使用现有表。

  • 永远不要忘记采访您的用户...特别是如果您可以找到一个用于初始部署系统的用户。如果它是内部设计的,可能是这些人提供了系统的一些初始要求,并与他们交谈将让您了解设计系统的人员在收集需求时首先听到的内容。贵公司的逻辑划分(客户关怀与运营与账单等等)通常与您的数据模型所遵循的划分相同。

  • 最后......玩!如果dev或QA环境可用,请开始编写查询并查看返回的内容...更改您的语句并重试。

我认为你想要避免的最大愚蠢只是关注如何安排表格。了解其中的数据,如何生成以及如何使用它们。了解您的公司,如何安排以及如何运作。它的存储方式(数据建模)是次要的理解。

答案 1 :(得分:5)

如果我跳进一个包含数百个表和数百万条记录的庞大SQL Server数据库,这里有两个用来帮助理解它的查询,找到“主”表,然后缩小到特定的表和列

--Query to show list of tables ordered by number of records in each table
    SELECT
        t.NAME AS TableName,
        SUM(p.rows) AS [RowCount]
    FROM 
        sys.tables t
    INNER JOIN      
        sys.indexes i ON t.OBJECT_ID = i.object_id
    INNER JOIN 
        sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
    INNER JOIN 
        sys.columns c on t.object_id = c.object_id
    WHERE   
        i.index_id <= 1
    GROUP BY 
        t.NAME, i.object_id, i.index_id, i.name 
    ORDER BY 
        SUM(p.rows) DESC



--Query to show any columns or table names like what I'm looking for
SELECT
    c.name, t.name
FROM sys.columns c
    INNER JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE '%#ColumnName%' OR t.name LIKE '%#TableName%'

答案 2 :(得分:1)

我最近经历了同样的过程...我认为最能帮助我的是创建自己的数据库图表。我使用免费工具wwwsqldesigner。这看起来很简单,我唯一的问题是由于某些原因它在Chrome中不起作用,但是firefox运行良好。我只是把我经常使用的表格放进去,并且当我需要做一些新的事情时,我发现我经常回顾它。

如果你可以使用自动生成的数据库图表,这将是一个更好的方法,但我个人无法让他们工作(我使用的是sql server)。

祝你好运!

答案 3 :(得分:0)

您可以使用SQL Server Management Studio创建实体关系模型,这样您就可以轻松查看db表之间的关系。基本上在管理工作室的db文件夹中有一个名为“Database Diagrams”的文件夹。只需右键单击它,然后选择“新数据库图表”。

答案 4 :(得分:0)

迁移后,旧的Foxpro服务器是否会与新的sql server共存?如果没有,你应该尝试零碎地破译系统。无需浪费时间处理任何停滞不前的代码。注释和图表,以获得对数据流的一般感觉并开始挖掘!

答案 5 :(得分:0)

以下脚本可能对您有所帮助。如果在任何已开发的数据库上使用它,您至少会了解表的关系。

SELECT
fk.name 'FK Name',
tp.name 'Parent table',
cp.name, cp.column_id,
tr.name 'Refrenced table',
cr.name, cr.column_id
FROM 
    sys.foreign_keys fk
INNER JOIN 
    sys.tables tp ON fk.parent_object_id = tp.object_id
INNER JOIN 
    sys.tables tr ON fk.referenced_object_id = tr.object_id
INNER JOIN 
    sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN 
    sys.columns cp ON fkc.parent_column_id = cp.column_id AND fkc.parent_object_id = cp.object_id
INNER JOIN 
    sys.columns cr ON fkc.referenced_column_id = cr.column_id AND fkc.referenced_object_id = cr.object_id
ORDER BY
 tp.name, cp.column_id

答案 6 :(得分:0)

Foxpro中有两种截然不同的数据对象 您很可能正在查看未包含在“数据库”中的免费数据表(DBF,CDX,IDX,FPT文件)。
或者Foxpro可能有一个数据库(一个DBC文件),它可以包含数据表,那些可以在相关条件下“保持”。

但是,Foxpro数据表在应用程序需要之前通常根本不相关,此时它们基于索引表达式动态相关。

使用一些表达式(例如:Fld1 + Fld2或Account_ID等)在数据表上构建索引,以满足应用程序的需要。
对于已创建索引的任何给定数据表,如果需要,可以“激活”这些索引。

相关表具有父/子关系,其中Child表已激活索引,而Parent通过其自己的字段中与子索引表达式匹配的值与该子项相关联。

将数据移动到SQL Server后如何使用数据取决于您为应用程序使用的数据。

如果您仍在使用Foxpro作为应用程序,您可以查询SQL Server并将记录返回到内存游标(它的工作方式与数据表非常相似),如果您返回多个SQL Server查询游标,则可以然后创建一个索引(使用表达式)并根据需要关联表。

如果要将应用程序更改为其他语言(例如VB.net或C ++),则必须通过SQL Query语法本身创建自己的“关系”。

请记住,移动数据表并不算太大 但改变应用程序语言是一项大交易,甚至你如何处理任何单个任务都必须以不同的方式处理 把它想象成将一本书从英文翻译成中文 - 一切都有可能改变。

如果您不确定和/或没有Foxpro的副本和应用程序的源代码,您最好考虑找一位顾问为您做这项工作,或者至少帮助/建议您。

另外,请记住,如果项目业务关键,那么您不应该试图降低转换成本。

祝你好运

答案 7 :(得分:0)

您可以使用 MySQL Workbench 对整个数据库或多个数据库进行逆向工程以将它们可视化以供初学者使用,稍后您必须遵循将其写在纸上以获得更好结果的幼稚方法。