其实你所说的20X20,应该说只是列数限制在20,行数应该是可以不限的
建议使用这样的数据库CREATE TABLE [dbo].[AT_ShippingBay] (
[ShippingPropertyID] [int] NOT NULL ,
[VoyageID] [int] NOT NULL ,
[BayID] [int] NOT NULL ,
[ID] [int] NOT NULL ,
[BayDetail] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[BayPlaceCode] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY]
GO
把你需要存储的数据,放在BayDetail中,也就是一个层形成一条记录
口口口    口口口            ----〉层
口口口口口口口口
口口口口口口口口
================
口口口口口口口口
  口口口口口口
  口口口口口口
    口口口口在BayDetail中,你的数据可以如此划分:1:[集装箱号 = ""][尺码 = ""];2:[集装箱号 = ""][尺码 = ""];3:[集装箱号 = ""][尺码 = ""]..................最好后头加一个结束符,如果能够使用整段的XML最好,你制定一个XSD即可
不过我还不知道如何在一个字段中存放XML和读取出来
查询的时候,你使用like就可以找到你需要的记录,然后再把这里头的数据解包即可对了,我认为船舶的甲板面存放的集装箱数最多,因此你的最大的数字需要来源于甲板面

解决方案 »

  1.   

    CREATE TABLE [dbo].[AT_ShippingBay] (
    [ShipID] [int] NOT NULL , //船号
    [xID] [int] NOT NULL ,    //货柜所在行ID
    [yID] [int] NOT NULL ,    //货柜所在列ID
    [zID] [int] NOT NULL ,    //货柜所在深度
             [Size][int] not null,     //货柜尺寸
    [BayDetail] [varchar] (8000) NULL //货柜所在描述
    ) ON [PRIMARY]
      

  2.   

    这样就可以取得任意位置的信息,并且判断其前后左右的信息。
    x,y,z的值是绝对位置的值,不是相对位置的值
      

  3.   

    to  thinkc(【抗火,抗冰冻,抗闪电,物理攻击无效】) 这确实是一个办法,但是同时导致了一个问题,就是无法这么实现因为现在最大的一艘船可以装8500个集装箱我还有一个相关的帖子http://community.csdn.net/Expert/topic/3288/3288788.xml?temp=.7689173
      

  4.   

    用二维的GIS概念实现可能会好些,比如空间位置的检索和存储等等
      

  5.   

    搂主的意思很简单,意思是这个数据表的数据量非常庞大,如果类似 thinkc(【抗火,抗冰冻,抗闪电,物理攻击无效】) 的做法,这个数据库的单个数据表必然会非常大,不利于数据的操作和查询其实按照我的方法,可以在字段中存放XML格式的字串,实在无法转换,可以转为XML文件进行处理,其实是用XML Document肯定可以处理如果需要查询某一个集装箱数据,使用like即可
    例如:集装箱数据如此定义:  <ContainerName>CLCU8875938</ContainerName>,查询的时候,使用 like '<ContainerName>CLCU8875938</ContainerName>'查询到的数据就非常准确了
      

  6.   

    这个简单!给甲板上的位置编号。如:
    1 2 3 4  5  6
    7 8 9 10 11 12
    按这种方式牌号然后用集合保存每个号码上的集装箱
    按序号开始保存 如 key = 1, value = 1    key = 2  value = 0   key  =3 value = 3
    该位置如果没有就是0,要是有重的保存序号小的 如:1和7是一个箱子 key =7 value = 1;这样吧集合序列化保存到数据库就行了
    取出来的是后返序列化就可以了搞定快给我分! 哈哈!
      

  7.   

    to  xinyulou(心雨楼 - .net精神病医院首席医师) 可能不能给你分,首先你说明的我并不明白,其次,你还没有理解船舶的性质我们把这个图称之为Bay,其实BayPlace的意思就是列的意思,也就是从船头到船尾可以摆下多少个标准的20尺集装箱就有多少个Bay,每一个Bay都有编号,按奇数编
    ▋▋▋▋▋▋   ---〉013Bay
    ▋▋▋▋▋▋   ---〉011Bay
    ▋▋▋▋▋▋   ---〉009Bay
    ▋▋▋▋▋▋   ---〉007Bay
    ▋▋▋▋▋▋   ---〉005Bay
    ▋▋▋▋▋▋   ---> 003Bay  横切面   然后从这幅图的下方往上方看,可以得到下图
      ▋▋▋▋     ---〉001Bay我们把这个图称之为BayPlace,每一个层都有编号,每一个列也都有编号
    口口    口口
    口口口口口口
    口口口口口口
    ============
    口口口口口口
    口口口口口口
    口口口口口口
      口口口口详细的编号例如
    0010686 0010486            0010386 0010586
    0010684 0010484 0010284 0010184 0010384 0010584
    0010682 0010482 0010282 0010182 0010382 0010582

    0010608 0010408 0010208 0010108 0010308 0010508
    0010606 0010406 0010206 0010106 0010306 0010506
    0010604 0010404 0010204 0010104 0010304 0010504
    0010402 0010202 0010102 0010302 甲板下,从下往上,从02开始,甲板上从下往上,从82开始,双数递增
    从中往外,右边从01开始,单数递增,左边从02开始,双数递增我认为还是采用XML比较好其实我也考虑到可以使用硬画的方式画位置,也就是说我可以直接根据这些Bay规则画集装箱的位置图,这个方案就可以去除这个位置表,唯一的问题是大于20尺的不大好处理
    to   lulz97(田野) 一个大的港口,比如上海港每天都会有三四十艘,如果采用我以前的做法,也就是说当平均一艘船有30个Bay的时候,每个航次的数据将会有600条记录,每天将会有21000的数据,运行两年之后,将会有15330000条记录。数据保存两年很正常的但是,集装箱并不见得有这么多,因为并不是每艘船都是在这里满载
      

  8.   

    关注,我认为数据设计一般就可以按照一个位置一条记录的方式数据量大是没有办法的,但是可以考虑记录备份,比方把最近1年/1月的记录存到当前表中,把以前的记录按月放到备份表一般一个月就150万条记录,而且我觉得你们业务中需要的查询会比较简单一般会只针对某一条船作查询,或者查某一个集装箱从哪条船上下来,所以分表存放能满足查询要求另外提醒一下,虽然每天会有30艘船,但是全世界的船也就这么几条所以应当把BayPlace的记录和集装箱的记录分开来
      

  9.   

    其实关键并不是保留BayPlace的记录,而是集装箱的记录,而这个是无法按照你一开始给出的表AT_ShippingBay存放的如果你的系统中需要集装箱的记录,那就只能采用分表存放的方式另外再提醒一下,采用大型的数据库,千万级别的记录还是可以忍受的
      

  10.   

    cnming(cnming) 的方法好像不错,可以试一下
      

  11.   

    最好是把详细的需求公布出来我认为集装箱肯定有一个独立的数据表,看这个数据结构,可能是因为要保存每一次的装载记录,要不然,可以不设立记录每一个集装箱位置的数据表可以考虑把整艘船的集装箱装载情况记录在一条记录中,或者把整个Bay记录在一条记录中,这样,记录即可少了很多另外,可以参考 test7979(test7979) 提的分表的方案,我以前曾经做过这样的数据分割,然后再建立一个视图,在视图中采用联合的形式连接两个数据表
      

  12.   

    主要分为三个数据表1、集装箱数据表,包含箱号、尺码、装载位置......
    2、船舶的集装箱可装载位置规范,类似AT_ShippingBay,同样是采用了最大20X20的方式
    3、船舶的实际装载记录,数据表就是AT_ShippingBay
    主要目的是要对集装箱的每次装载进行记录,同时画出直观的位置图,位置图就如
    口口    口口
    口口口口口口
    口口口口口口
    ============
    口口口口口口
    口口口口口口
    口口口口口口
      口口口口
    同时标上箱号、尺码、重量、位置编号等等
      

  13.   

    如果无需保存每一次的状态的话,建议去除AT_ShippingBay,只保留集装箱数据表,和船舶的Bay位数据表
    船舶的Bay位数据表类似我之前提的模式CREATE TABLE [dbo].[AT_ShippingBay] (
    [ShippingPropertyID] [int] NOT NULL ,
    [VoyageID] [int] NOT NULL ,
    [BayID] [int] NOT NULL ,
    [ID] [int] NOT NULL ,
    [BayDetail] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
    [BayPlaceCode] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
      

  14.   

    CREATE TABLE [dbo].[AT_ShippingBay] (
    [ShipID] [int] NOT NULL , //船号
    [xID] [int] NOT NULL ,    //货柜所在行ID
    [yID] [int] NOT NULL ,    //货柜所在列ID
    [zID] [int] NOT NULL ,    //货柜所在深度
    [goods_id] //货柜ID
    ) ON [PRIMARY]
    --集装箱分为20尺,40尺,45尺,48尺,假设一个“▋”代表一个20尺的的--集装箱,则40尺需要占两个
    抽象成三种情况,20尺,40尺,60尺,然后把40尺和60尺的抽象成两个20尺,和3个20尺的基本单位。
      

  15.   

    shenen(真的愛你) 的方法并不适用,最早曾经测试过这个方法