Dang. I was not aware of that.  Well, I suppose I wasn’t aware of a lot of 
things with that considering it’s not really a mainstream database.  But then, 
there’s always the issue of whether Raven’s the right tool for the job, as with 
everything, and not every project is a suitable candidate for NoSQL, is it?

From: ozdotnet-boun...@ozdotnet.com [mailto:ozdotnet-boun...@ozdotnet.com] On 
Behalf Of Heinrich Breedt
Sent: Wednesday, March 27, 2013 5:13 PM
To: ozDotNet
Subject: RE: occasionally connected application design problem


Yes
On 28 Mar 2013 06:33, "Katherine Moss" 
<katherine.m...@gordon.edu<mailto:katherine.m...@gordon.edu>> wrote:
Yes, but can RavenDB replicate to SQL Server or SQL Server Express?

From: ozdotnet-boun...@ozdotnet.com<mailto:ozdotnet-boun...@ozdotnet.com> 
[mailto:ozdotnet-boun...@ozdotnet.com<mailto:ozdotnet-boun...@ozdotnet.com>] On 
Behalf Of Heinrich Breedt
Sent: Wednesday, March 27, 2013 2:12 PM
To: g...@greglow.com<mailto:g...@greglow.com>; ozDotNet
Subject: RE: occasionally connected application design problem


Ravendb with replication might be an option
On 28 Mar 2013 02:05, "Greg Low (GregLow.com)" 
<g...@greglow.com<mailto:g...@greglow.com>> wrote:
Hi Corneliu,

I don’t mind roll-your-own solutions. They work ok. Biggest issue I come across 
with those LastUpdated type columns is checking out how they get updated. I 
often see people run into issues with those if they don’t understand how they 
were updated.

For example, doing work on a DB2 site recently, they had a scheme like this but 
missed the odd row. Turns out that they were using a trigger to set the 
LastUpdated column value. But the value appeared when the trigger finished 
running yet it was set to the time value of when the trigger started. So, it 
looked like (occasionally) a row jumped backwards in time. Similar issues can 
happen when they are updated in proc code, and even worse when they are updated 
based on client code.

99% of those problems are avoided by saying “give me everything since last time 
but only up to a few seconds ago” instead of getting everything up to the most 
recent.

Sync Framework does work reasonably well. Azure Data Sync is still in preview 
but we’ve had pretty good success with it for simple scenarios.

Replication is probably overkill and isn’t supported on all editions, so that 
might be a limiting factor.

And just to add to the “can’t believe that pasta sauce is a vege” discussion in 
the USA, we have nothing to be proud of. The GST exemption on food that the 
Greens needed before passing the legislation has led to significant chunks of 
our Tax Act that define what “food” is.

For example, we now have several pages in the Australian Tax Act that cover the 
definitions of the word “pudding”. I shudder to think what that cost us all to 
have that written <sigh>.

Regards,

Greg

Dr Greg Low

1300SQLSQL (1300 775 775) office | +61 419201410<tel:%2B61%20419201410> mobile│ 
+61 3 8676 4913<tel:%2B61%203%208676%204913> fax
SQL Down Under | Web: www.sqldownunder.com<http://www.sqldownunder.com/>

From: ozdotnet-boun...@ozdotnet.com<mailto:ozdotnet-boun...@ozdotnet.com> 
[mailto:ozdotnet-boun...@ozdotnet.com<mailto:ozdotnet-boun...@ozdotnet.com>] On 
Behalf Of Corneliu I. Tusnea
Sent: Wednesday, 27 March 2013 8:07 PM
To: ozDotNet
Subject: Re: occasionally connected application design problem

Greg,

I'm sure the SQL guys will tell you about some "magical tool" that can do all 
of this for you hands free and without any headaches (fingers crossed) but my 
take would be the good old REST API model.

1. For every Table have two columns LastUpdated, LastUploaded and 
LastDownloaded. Every change you do locally you update the LastUpdated to UTC 
now (never use local times!)
2. Keep a table with the "sync status" of each table where all you need to 
store is the TableName, LastUploaded and LastDownloaded.
3. Have a background thread that tries to monitor for network events (don't 
continuously try to ping your server as your'll burn the battery of those 
devices).  
http://www.codeproject.com/Articles/64975/Detect-Internet-Network-Availability
4. When you have connectivity all you need to do is select top 100 from each 
table where LastUpdatd for the Status for the table < LastUpdated of the row.
(I don't know if I make sense but basically you want to select all the rows 
that were changed since point of your LastUpdated in your Status table).
You then try to push those back to your server. For every row that "made it" to 
the server you update the LastUploaded to UtcNow or even better I would update 
it to the time just before you started the sync.
5. You do the reverse for downloading data. You ask the server for all changes 
since your LastDownload. Once all the changes were received, you update your 
own LastDownload.
With a bit of reflection and some clear naming conventions you could code all 
of this generically enough that you can simply run it on your database 
disregarding the number of tables & columns.

I'm now going to let the SQL guys deliver their magical tool :)

Regards,
Corneliu.



On Wed, Mar 27, 2013 at 8:41 PM, Greg Harris 
<harris.gre...@gmail.com<mailto:harris.gre...@gmail.com>> wrote:
Dear People,

I need some help to get some good ideas for a design issue I am facing…

The application will be geographically dispersed and only occasionally 
connected to the internet with a slow / unreliable connection.
The users at remote branch offices are doing daily data entry to their own 
local databases (probably SQL express databases).
On a periodic basis the remote branch offices need to synchronise data with 
head office (probably a full SQL database).
Most (99%) of data will travel from the remote branch offices the head office 
some reference data may travel back to the remote branch office.

There are a couple of design ideas that I have had:

SQL Server Replication: (http://msdn.microsoft.com/en-us/library/ms151198.aspx) 
I do not know how well this will work on wires that are of such poor quality.  
Also how easy (hard) it will be to support remotely.

Program based updates: Have a program running in the background at each site 
attempting connection with head office transferring data.  All rows would have 
a transferred status flag, that would be set once successful transfer has been 
acknowledged.

File extracts: Once an hour produce a text file (with check sum) of all data 
entered in the last hour, background job copies file to head office server 
which will then apply updates to head office server.

Please share with me and the group what design ideas and experiences you have 
had that worked well and the ones you would avoid if faced with the same design 
decision again today.

Many thanks
Greg Harris

Reply via email to