分布式数据库课程设计与实现——面向连锁超市管理系统的分布式数据库设计与实现内容摘要:

每个分店是一个相对独立的数据库服务系统,其可以连接任意数量的客户端。 通信模型如下图所示: 25 数据表的分片与位置分配设计 根据以上得到的关于主要信息数据的需求分析结果,为该连锁超市系统的分布式数据库系统进行主要信息数据的分片和分配设计如下: 数据的分片设计 ( 1)由于该连锁超市系统的各连锁店之间在经营上是独立的,每个门店只关心自己的 经营状况,有关供应商信息、 POS 机信息、商 26 品信息和进货 /销货信息等基础数据都是各门店单独管理和使用,门店之间互不相关。 因此,商品明细表、供应商表、 POS 机表、库存表、进货 /销售开单表、进货 /销售商品表、进货 /销售退货商品表按照地域(门店所在区域标志)采用水平分片的方法得到水平片段。 ( 2)这里我们对于商品信息进行了垂直分片,分成了商品明细表和库存表,因为商品的某些属性,例如库存量等需要经常更新,因此将这些属性划分出来构成单独的实体可以减少系统开销。 ( 3)由于整个连锁超市的职员信息由总公司管理和维护,各门店 只可以查询本店的职员信息。 所以职员信息不必分片,可以采用视图的形式提供给各门店查询本门店的职员信息。 另外,各个区域数据库服务器的 IP 地址信息也只是由总部管理、维护,所以也不必分片。 ( 4)由于商品分类数据由总部统一管理并提供各门店使用,而且,商品类别信息数据在各门店都要经常使用。 因此,商品类别信息数据也不必分片。 ( 5)该分布式数据库系统实现了简单的目录管理,记录数据库中各个表的分片和分配信息,以便数据更新时,维护各个站点上数据的一致性。 这个表由总部规划建立,各门店也会经常使用。 因此,数据库目录信息表也不必 分片。 数据及其片段的分配设计 ( 1)对于只在各门店单独使用的除商品类别信息和数据库目录信息以外的其他基础信息的片段,采用按区域分片然后分配到各个门店的数据库服务器上。 总站上有所有门店的所有信息。 27 ( 2)整个系统的职员信息、 IP 地址信息由公司总部管理和维护,所以只分配在总部站点中。 ( 3)商品类别信息、数据库目录信息是由总部统一规定并下发到各门店的,由于各店经常会使用到这类基础信息,因此在各门店都具有相同的副本。 所以,商品类别信息、数据库目录信息都不会分片但被复制,且复制的个数为门店的个数。 5. 基于 SQL 的 SMS 的详细设计(实现) 公共类设计 为了提高程序代码的开发效率,便于代码重用,在系统开发中,创建了一些数据操作类和控件扩展类。 文件操作类 CFileOperate 为了便于对硬盘文件的操作,开发了文件操作类 CFileOperate,它通过调用 API 函数实现常用的文件操作。 CFileOperate 类的声明代码如下。 extern CString strTmpPath。 class CFileOperate { public: //构造函数 CFileOperate()。 //取得当前 程序运行的路径 CString GetAppPath()。 //判断是否存在 strFn 文件夹 BOOL IsFileExist(CString strFn, BOOL bDir)。 //制作 strFloderName 文件夹返回文件夹名 CString MakeDirectory(CString strFloderName)。 //自动生成文件夹 28 CString MakeDirectory()。 //得到文件夹名为 strFloderName 的路径 CString GetDirectoryPath(CString strFloderName)。 //删除 strFloderdName 文件夹 void delDirectory(CString strFloderdName)。 //删除主文件夹 (data) void delMainDirectory()。 //制作主文件夹 void MakeMainDirectory()。 //判断 strIntDigit 是否为整数,是否小于 intBig BOOL CheckIntDigit(CString strIntDigit,int intBig)。 //判断 strFileName 是否可以做文件夹或文件的名字 BOOL CheckFileName(CString strFileName)。 //判断 strText 是否为空 BOOL CheckEmpty(CString strText)。 //删除 strFloderName 文件夹下名为 strFileName 的文件 void delFile(CString strFloderName,CString strFileName)。 //得到 strFloderName 文件夹下名为 strFileName 的文件路径 CString GetFileName(CString strFolderName,CString strFileName)。 //制作 strFloderName 文件夹下名为 strFileName 的文件 CString MakeFile(CString strFloderName,BOOL blnMake)。 //显示文件夹对话框 BOOL GetFolder(CString* strSelectedFolder,const char* lpszTitle,const HWND hwndOwner,const char* strRootFolder,const char* strStartFolder)。 系统程序中主要用到了 CFileOperate 类中的 GetAppPath 函数。 GetAppPath 函数用于获取当前运行程序所在文件夹的路径,其实现代码如下。 CString CFileOperate::GetAppPath()//取得当前运行程序所在文件夹路径 { char lpFileName[MAX_PATH]。 //路径数组 //获取当前运行程序的全路径 GetModuleFileName(AfxGetInstanceHandle(),lpFileName,MAX_PATH)。 CString strFileName = lpFileName。 //从字符串的最右边向左搜索 39。 \\39。 串 int nIndex = (39。 \\39。 )。 CString strPath。 if (nIndex 0) strPath = (nIndex)。 //取 39。 \\39。 串左边字符 else strPath =。 return strPath。 //返回前运行程序的文件夹路径 29 } 时间格式转换类 CMyTime 系统开发中,需要频繁的对日期、时间数据进行操作,因此这里设计了类 CMyTime,实现简单的时间日期转换, CMyTime 类的声明如下。 class CMyTime { public: CTime ValueTime。 //CTime 类型的值 //blnChinese:TRUE年月日时分秒 FALSE: CString GetAllString(BOOL blnChinese)。 //返回字符串形式的日期时间 //blnChinese:TRUE年月日 FALSE CString GetDateString(BOOL blnChinese)。 //返回字符串形式的日期 //blnChinese:TRUE时分秒 FALSE: CString GetTimeString(BOOL blnChinese)。 //返回字符串形式的时间 CString GetSimpleString()。 //返回简单字符串形式的日期时间 CString GetWeek()。 //返回星期 星期日 //设置字符串形式的值 //blnSimple:TRUE(%Y%m%d%H%M%S) FALSE(年月日时分秒或 :) void SetAllString(CString Value,BOOL blnSimple)。 void SetNow()。 //设置成现在时间 CMyTime()。 //构造函数 }。 SetNow 函数获取当前日期,时间,将其值赋予 ValueTime。 void CMyTime::SetNow() { ValueTime=CTime::GetCurrentTime()。 } 数据操作类 CADOConn 系统开发了数据操作类 CADOConn,它是本系统的核心,实现了对数据库数据的基本操作功能, CADOConn 类的声明代码如下。 import c:\program files\mon files\system\ado\ \ no_namespace rename (EOF, adoEOF) 30 class CADOConn { // 定义变量 public: _ConnectionPtr m_pConnection。 //指向 Connection 对象指针 : //添加一个指向 Recordset 对象的指针 : _RecordsetPtr m_pRecordset。 _bstr_t m_strData。 int m_DataType。 CADOConn(int DataType)。 //构造函数 CADOConn()。 virtual ~CADOConn()。 void OnInitCADOConn()。 //初始化连接数据库 _RecordsetPtramp。 GetRecordSet(CString strSQL)。 //执行查询 BOOL ExecuteSQL(CString strSQL)。 //执行 SQL 语句, Insert Update delete void ExitConnect()。 //退出连接 BOOL MoveFirst()。 //字段集移向开头 BOOL MoveNext()。 //字段集向下移 BOOL Open(CString strSQL)。 //打开记录集 BOOL OpenLogo(CString strSQL)。 //打开记录集 CString GetValueString(int index,int strSum)。 //返回记录集中某字段的字符串 byte GetValueByte(int index)。 //返回记录集中某字段的字节 int GetValueInt(int index)。 //返回记录集中某字段的短整数 double GetValueDouble(int index)。 //返回记录集中某字段的双精度数 float GetValueFloat(int index)。 //返回记录集中某字段的单精度数 long GetValueLong(int index)。 //返回记录集中某字段的长整型数 CTime GetValueDate(int index)。 //返回记录集中某字段的日期时间 //获取记录集某字段的 BYTE 值,并换为 CString返回 CString GetValueByteStr(int index,int strSum)。 //获取记录集某字段的 INT 值,并换为 CString返回 CString GetValueIntStr(int index,int strSum)。 //获取记录集某字段的 Double 值,并换 为 CString返回 CString GetValueDoubleStr(int index,int strLSum,int strRSum)。 //获取记录集某字段的 Float 值,并换为 CString返回 CString GetValueFloatStr(int index,int strLSum,int strRSum)。 //获取记录集某字段的 Long值,并换为 CString返回 CString GetValueLongStr(int index,int strSum)。 //获取记录集某 字段的 CTime 值,并换为 CString返回 CString GetValueDateStr(int index,CString strType)。 //添加单项数据 BOOL AddItem(CString strTable,int strSum,LPCTSTR pszText, ... )。 //得到字段中数据的类型 int GetValueType(int index)。 BOOL adoEOF()。 //记录集的结束判断 31 BOOL FillList(CListCtrl *listMain,int ColOpenEnd)。 //填充列表 (ColOpenEnd 代表展开多少列 ) BOOL InitList(CListCtrl *listMain,int colSum)。 //初始化列表 CString GetAppPath()。 //得到应用程序所在的文件夹 BOOL FillList(。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。