Sunday, January 2, 2011

Business Logic: From Working Definition to Rigorous Definition

This is part 2 of a 4 part mini-series that began before the holidays with A Working Definition Business Logic. Today we proceed to a rigorous definition, tomorrow we will see some theorems, and the series will wrap up with a post on the "business layer."

In the first post, the working definition said that business logic includes at least:

  • The Schema
  • Calculations
  • Processes

None of these was very rigorously defined, kind of a "I'll know it when I see it" type of thing, and we did not talk at all about security. Now the task becomes tightening this up into a rigorous definition.

Similar Reading

Toon Koppelaars has some excellent material along these same lines, and a good place to start is his Helsinki Declaration (IT Version). The articles have a different focus than this series, so they make great contrasting reading. I consider my time spent reading through it very well spent.

Definitions, Proofs, and Experience

What I propose below is a definition in four parts. As definitions, they are not supposed to prove anything, but they are definitely supposed to ring true to the experience of any developer who has created or worked on a non-trivial business application. This effort would be a success if we reach some concensus that "at least it's all in there", even if we go on to argue bitterly about which components should be included in which layers.

Also, while I claim the definitions below are rigorous, they are not yet formal. My instinct is that formal definitions can be developed using First Order Logic, which would allow the theorems we will see tomorrow to move from "yeah that sounds about right" to being formally provable.

As for their practical benefit, inasmuch as "the truth shall make you free", we ought to be able to improve our architectures if we can settle at very least what we are talking about when we use the vague term "business logic."

The Whole Picture

What we commonly call "business logic", by which we vaguely mean, "That stuff I have to code up", can in fact be rigorously defined as having four parts, which I believe are best termed orders, as there is a definite precedence to their discovery, analysis and implementation.

  • First Order: Schema
  • Second Order: Derivations
  • Third Order: Non-algorithmic compound operations
  • Fourth Order: Algorithmic compound operations

Now we examine each order in detail.

A Word About Schema and NoSQL

Even "schema-less" databases have a schema, they simply do not enforce it in the database server. Consider: an eCommerce site using MongoDB is not going to be tracking the local zoo's animal feeding schedule, because that is out of scope. No, the code is limited to dealing with orders, order lines, customers, items and stuff like that.

It is in the very act of expressing scope as "the data values we will handle" that a schema is developed. This holds true regardless of whether the datastore will be a filesystem, an RDBMS, a new NoSQL database, or anything else.

Because all applications have a schema, whether the database server enforces it or whether the application enforces it, we need a vocabulary to discuss the schema. Here we have an embarrasment of choices, we can talk about entities and attributes, classes and properties, documents and values, or columns and tables. The choice of "entities and attributes" is likely best because it is as close as possible to an implementation-agnostic language.

First Order Business Logic: Schema

We can define schema, including security, as:

that body of entities and their attributes whose relationships and values will be managed by the application stack, including the authorization of roles to read or write to entities and properties.

Schema in this definition does not include derived values of any kind or the processes that may operate on the schema values, those are higher order of business logic. This means that the schema actually defines the entire body of values that the application will accept from outside sources (users and other programs) and commit to the datastore. Restating again into even more practical terms, the schema is the stuff users can save themselves.

With all of that said, let's enumerate the properties of a schema.

Type is required for every attribute.

Constraints are limits to the values allowed for an attribute beyond its type. We may have a discount percent that may not exceed 1.0 or 100%.

Entity Integrity is usually thought of in terms of primary keys and the vague statement "you can't have duplicates." We cannot have a list of US States where "NY" is listed 4 times.

Referential Integrity means that when one entity links or refers to another entity, it must always refer to an existing entity. We cannot have some script kiddie flooding our site with sales of items "EAT_ME" and "F***_YOU", becuase those are not valid items.

The general term 'validation' is not included because any particular validation rule is is a combination of any or all of type, constraints, and integrity rules.

Second Orders Business Logic: Derived values

When we speak of derived values, we usually mean calculated values, but some derivations are not arithmetic, so the more general term "derived" is better. Derivations are:

A complete entity or an attribute of an entity generated from other entities or attributes according to a formula or rule.

The definition is sufficiently general that a "formula or rule" can include conditional logic.

Simple arithmetic derived values include things like calculating price * qty, or summing an order total.

Simple non-arithmetic derivations include things like fetching the price of an item to use on an order line. The price in the order is defined as being a copy of the item's price at the time of purchase.

An example of a complete entity being derived is a history table that tracks changes in some other table. This can also be implemented in NoSQL as a set of documents tracking the changes to some original document.

Security also applies to generated values only insofar as who can see them. But security is not an issue for writing these values because by definition they are generated from formulas and rules, and so no outside user can ever attempt to explicitly specify the value of a derived entity or property.

One final point about Second Order Business Logic is that it can be expressed declaratively, if we have the tools, which we do not, at least not in common use. I wrote one myself some years ago and am re-releasing it as Triangulum, but that is a post for another day.

Sorting out First and Second Order

The definitions of First and Second Order Business Logic have the advantage of being agnostic to what kind of datastore you are using, and being agnostic to whether or not the derived values are materialized. (In relational terms, derivations are almost always denormalizing if materialized, so in a fully normalized database they will not be there, and you have to go through the application to get them.)

Nevertheless, these two definitions can right off bring some confusion to the term "schema." Example: a history table is absolutely in a database schema, but I have called First Order Business Logic "schema" and Second Order Business Logic is, well, something else. The best solution here is to simply use the terms First Order Schema and Second Order Schema. An order_lines table is First Order schema, and the table holding its history is Second Order Schema.

The now ubiquitous auto-incremented surrogate primary keys pose another stumbling block. Because they are used so often (and so often because of seriously faulty reasoning, see A Sane Approach To Choosing Primary Keys) they would automatically be considered schema -- one of the very basic values of a sales order, check, etc. But they are system-generated so they must be Second Order, no? Isn't the orderid a very basic part of the schema and therefore First Order? No. In fact, by these definitions, very little if any of an order header is First Order, the tiny fragments that are first order might be the shipping address, the user's choice of shipping method, and payment details provided by the user. The other information that is system-generated, like Date, OrderId, and order total are all Second Order.

Third Order Business Logic

Before defining Third Order Business Logic I would like to offer a simple example: Batch Billing. A consulting company bills by the hour. Employees enter time tickets throughout the day. At the end of the month the billing agent runs a program that, in SQL terms:

  • Inserts a row into INVOICES for each customer with any time entries
  • Inserts a row into INVOICE_LINES that aggregates the time for each employee/customer combination.

This example ought to make clear what I mean by definining Third Order Business Logic as:

A Non algorithmic compound operation.

The "non-algorithmic" part comes from the fact that none of the individual documents, an INVOICE row and its INVOICE_LINES, is dependent on any other. There is no case in which the invoice for one customer will influence the value of the invoice for another. You do not need an algorithm to do the job, just one or more steps that may have to go in a certain order.

Put another way, it is a one-pass set-oriented operation. The fact that it must be executed in two steps is an artifact of how database servers deal with referential integrity, which is that you need the headers before you can put in the detail. In fact, when using a NoSQL database, it may be possible to insert the complete set of documents in one command, since the lines can be nested directly into the invoices.

Put yet a third way, in more practical terms, there is no conditional or looping logic required to specify the operation. This does not mean there will be no looping logic in the final implementation, because performance concerns and locking concerns may cause it to be implemented with 'chunking' or other strategies, but the important point is that the specification does not include loops or step-wise operations because the individual invoices are all functionally independent of each other.

I do not want to get side-tracked here, but I have had a working hypothesis in my mind for almost 7 years that Third Order Business Logic, even before I called it that, is an artifact, which appears necessary because of the limitations of our tools. In future posts I would like to show how a fully developed understanding and implementation of Second Order Business Logic can dissolve many cases of Third Order.

Fourth Order Business Logic

We now come to the upper bound of complexity for business logic, Fourth Order, which we label "algorithmic compound operations", and define a particular Fourth Order Business Logic process as:

Any operation where it is possible or certain that there will be at least two steps, X and Y, such that the result of Step X modifies the inputs available to Step Y.

In comparison to Third Order:

  • In Third Order the results are independent of one another, in Fourth Order they are not.
  • In Third Order no conditional or branching is required to express the solution, while in Fourth Order conditional, looping, or branching logic will be present in the expression of the solution.

Let's look at the example of ERP Allocation. In the interest of brevity, I am going to skip most of the explanation of the ERP Allocation algorithm and stick to this basic review: a company has a list of sales orders (demand) and a list of purchase orders (supply). Sales orders come in through EDI, and at least once/day the purchasing department must match supply to demand to find out what they need to order. Here is an unrealistically simple example of the supply and demand they might be facing:

  *** DEMAND ***          *** SUPPLY ***

    DATE    | QTY           DATE    | QTY
------------+-----      ------------+----- 
  3/ 1/2011 |  5          3/ 1/2011 |  3
  3/15/2011 | 15          3/ 3/2011 |  6
  4/ 1/2011 | 10          3/15/2011 | 20
  4/ 3/2011 |  7   

The desired output of the ERP Allocation might look like this:

 *** DEMAND ***      *** SUPPLY ****
    DATE    | QTY |  DATE_IN   | QTY  | FINAL 
  3/ 1/2011 |  5  |  3/ 1/2011 |  3   |  no
                  |  3/ 3/2011 |  2   | Yes 
  3/15/2011 | 15  |  3/ 3/2011 |  4   |  no
                  |  3/15/2011 | 11   | Yes
  4/ 1/2011 | 10  |  3/15/2011 |  9   |  no
  4/ 3/2011 |  7  |    null    | null |  no

From this the purchasing agents know that the Sales Order that ships on 3/1 will be two days late, and the Sales Orders that will ship on 4/1 and 4/3 cannot be filled completely. They have to order more stuff.

Now for the killer question: Can the desired output be generated in a single SQL query? The answer is no, not even with Common Table Expressions or other recursive constructs. The reason is that each match-up of a purchase order to a sales order modifies the supply available to the next sales order. Or, to use the definition of Fourth Order Business Logic, each iteration will consume some supply and so will affect the inputs available to the next step.

We can see this most clearly if we look at some pseudo-code:

for each sales order by date {
   while sales order demand not met {
      get earliest purchase order w/qty avial > 0
         break if none
      make entry in matching table
      // This is the write operation that 
      // means we have Fourth Order Business Logic
      reduce available qty of purchase order
   break if no more purchase orders


As stated in the beginning, it is my belief that these four orders should "ring true" with any developer who has experience with non-trivial business applications. Though we may dispute terminology and argue over edge cases, the recognition and naming of the Four Orders should be of immediate benefit during analysis, design, coding, and refactoring. They rigorously establish both the minimum and maximum bounds of complexity while also filling in the two kinds of actions we all take between those bounds. They are datamodel agnostic, and even agnostic to implementation strategies within data models (like the normalize/denormalize debate in relational).

But their true power is in providing a framework of thought for the process of synthesizing requirements into a specification and from there an implementation.

Tomorrow we will see some theorems that we can derive from these definitions.


Anonymous said...

> Now for the killer question: Can the desired output be generated in a single SQL query?

Not even with the MODEL-clause...?


br1 said...

Here's a completely formal way to think of schemas:

Sudhir DBAKings said...

Nice post very helpful


Garry Laly said...

Very nice.
Follow my blog for tutorial about computer and programming :

simon jarry said...

I don't have any words to enjoy this publish.....I am really amazed ....the particular person who developed this post certainly realized the topic well..thanks for sharing this with us.

BrainShakers Interactive

Martin Mathur said...

Hi, saw your post and find it very helpful as we are also involved in Database appending and Mailing Database

yogi shuemantri said...

nice post :), please visit back :D thanks :D

Chui Tey said...


Please write the follow up on how 3rd order is limitation of our tools. Many thanks!


Tegar Fajar said...

Prediksi Bola | Judi Online | Bursa Taruhan Casino | Taruhan Bola
Judi Bola Terpercaya | Bandar Bola Online | Agen Taruhan
Prediksi Bola | Judi Online | Agen Casino | Taruhan Bola
Casino Online | Agen Bola | Prediksi Dan Berita Sepakbola
Agen Bola Online | Bandar Bola | Agen Casino| Situs Judi
Agen Bola | Taruhan Online | Bandar Judi Terpercaya
Agen Bola | Taruhan Bola Online | Agen Casino Terpercaya
Taruhan Bola | Judi Online | Agen Casino Terpercaya
Agen Bola Online, Situs Judi Casino Online, Bandar Taruhan Bola
Agen Casino | Judi Online | Bursa Taruhan | Bandar Bola
Agen Judi Bola | Bandar Bola Online | Casino Online
Informasi Terupdate | Sumber Berita | Sumber Inspirasi
Berita Terbaru | Inovatif
Berita Bola | Prediksi Bola Jitu
Hanya Untuk Anda Pecinta Dunia Maya
Info Masa Depan | Ulas Bola Hari Ini
Info Terupdate | Berita Inovatif | Berita Pilihan
Prediksi Skor | Berita Bola | Jadwal Bola
Prediksi Bola | Pasaran Bola | Berita Bola Online
Informasi Terkini | Prediksi Dan Berita Sepakbola
Info Berita Terbaik | Bursa Taruhan
Berita Terhangat | Info Masa Depan
Berita Terupdate | Sumber Berita
Hasil Skor | Prediksi Bola Terpercaya
agen texas poker dan domino
bola pelangi agen bola sbobet
Judi Online
Taruhan Bola
Agen Casino
Bandar Bola
Agen bola, poker, judi on-line, Prediksi bola, togel

Tegar Fajar said...

47Info Skor Hari Ini | Update Bola
Prediksi Online | Bursa Taruhan Bola
Berita Terkini | Informasi Akurat Berimbang
Jadwal Dunia Sepak Bola | Prediksi Skor
Dapatkan Info Berita Bola Terbaru
Informasi | Berita Terbaru Era Masa Kini
Harian Bola | Bursa Online dan Berita Bola
Info Terakurat dan Terpercaya
Opini Info Terkini
Info Terkini | Kumpulan Informasi
Info Online | Berita Bola | Prediksi Skor | Cerita Dewasa
Semua Tentang Bola dan Khusus Dewasa
Portal Berita Bola | Prediksi Skor
Berita Informasi Terkini | Harian Bola | Ulas bola
Info Akurat | Prediksi Bola - Berita Bola - Jadwal Bola
Info Berita Bola | Prediksi Skor | Cerita Dewasa
Sumber Informasi Terkini | Cerita Dewasa
Berita Akurat Bola | Cerita Sex dan Foto Bugil | Prediksi Bola
Info Akurat | Cerpen Dewasa | Foto Seksi
Info Bola | Bursa Bandar Bola | Dewasa News
Prediksi Bola Malam | Berita Bola
Berita Baru dan Selalu Update
Informasi Terkini | Prediksi Dan Berita Sepakbola
Berita Terkini Dan Terpecaya
Bocoran | Prediksi Togel Singapura | Hongkong | Macau
Info Asia Skor | Prediksi Skor | Berita Bola
Info Berita | Prediksi Skor | Berita Bola | Tips Dan Trik
Ulas Bola Hari Ini | Prediksi Skor | Jadwal Bola
Agen Bola Sbobet
Agen Bola Sbobet - Judi Online | Bursa Taruhan Bola
Agen Bola Terpercaya | Judi Bola | Taruhan Bola Indonesia

Tegar Fajar said... Agen Poker Domino Online Uang Asli Tanpa Robot
BUNDAPOKER.COM Agen Texas Poker dan Domino Online Indonesia Terpercaya
DaunPoker.Net Agen Poker Domino Online Indonesia Terbaik Terbesar dan Terpercaya
SaranaPoker.COM Agen Texas Poker Dan Domino Online Indonesia
GLOBALBOLA.COM Agen Bola Piala Dunia 2014 SBOBET IBCBET Casino Poker Tangkas Togel Online Terbaik Terbesar Dan Terpercaya Agen Poker Domino Online Uang Asli Indonesia Terpercaya Tanpa Robot
DAUNPOKER.NET AGEN POKER DOMINO ONLINE INDONESIA TERBAIK TERBESAR DAN TERPERCAYA Agen Poker Domino Online Uang Asli Indonesia Terpercaya Tanpa Robot Agen Poker Domino Online Indonesia Terbaik Terbesar Dan Terpercaya

Asis Bapi said...

Thanks Zhe. Even if late, I've updated the code and tutorial now.

obat herbal ambeien akut said...

cara mengatasi berbagai macam penyakit secara alami
Obat Herbal Penurun Darah Tinggi Obat Herbal Ambeien Akut Obat Herbal Batu Empedu Tanpa Operasi Obat Herbal Sinusitis Kronis Obat Herbal Tumor Otak Jinak Obat Herbal Wasir Kronis Tanpa Operasi Obat Herbal Liver Kronis Paling Ampuh Obat Herbal Bronkitis Kronis Obat Herbal Usus Buntu Tanpa Operasi Obat Herbal Eksim Paling Ampuh Obat Herbal Gagal Ginjal Kronis

obat herbal glaukoma said...

pengobatan penyakit glaukoma secara alami tanpa operasi

Obat Herbal Glaukoma

obat herbal kanker hati tanpa operasi said...

cara alami mengatasi penyakit kanker hati tanpa operasi
Obat Herbal Kanker Hati Tanpa Operasi

obat herbal tbc said...

your post is very interesting
thank you for sharing
i really liked

Obat Herbal TBC

obat herbal polip hidung said...

excellant post

Obat Herbal Polip Hidung

Choky Ryovandy said...




DATA KOMPLIT ( PAKET 1 ) Versi 2015
HANYA Rp 188.000,- NETT
Database yang akan didapatkan kepada Anda adalah Data Berupa Perusahaan Corporate , BUMN , SWASTA , PMA , PMDN , CV , PT , PO ,FIRMA

DATA KOMPLIT ( PAKET 2 ) Versi 2015
HANYA Rp 388.000,- NETT
Database ini lengkap dengan nama pemilik, no hp pribadi, no telepon rumah, alamat, dll. Sangat cocok bagi anda yang bergerak di bidang usaha apa pun. Baik anda sebagai owner, investor, tenaga pemasar, analis, konsultan, dll.
Anda dapat memasarkan produk bisnis anda menggunakan database yang berharga ini.
Dengan jumlah ratusan ribu data orang berduit ini anda “tidak akan pernah” kehabisan bahan untuk mengirimkan penawaran bisnis dan memasarkan produk atau usaha anda.

Sebagai asumsi, Jika minimal dalam satu hari anda mengirimkan penawaran bisnis atau melakukan follow up bisnis ke minimal 50 orang saja, simulasinya seperti ini:
Database ini berjumlah lebih dari ± 300.000 data.
± 300.000 / 50 = 6.000
HANYA Rp 500.000,- NETT
Anda juga dapat membeli produk kami secara satuan sesuai kebutuhan anda


ADMIN 1 : (62) (0) 819 1653 9805 ( WHATSAPP )
ADMIN 2 : (62) (0) 896 9040 7771
Email :

Shiya Priya said...

Nice Website...
Hey JOIN now and Increase Facebook Likes your profile and websites.
Increase Facebook Likes and check your website worth worth my websites
its may be very beneficial for you also really

شات دردشة بنات مصر شات مصريه said...

شات مصر
شات مصرية

شات مصرى
شات بنات مصر
شات مصرى
بنات مصر
شات مصرى
شات بنات
شات مصر
شات مصرية

شات دردشة بنات مصر شات مصريه said...

شات بنات مصر
شات بنات مصر
شات مصرى
شات مصرى
شات مصري
بنات مصر

شات مصر
شات مصرية

شات مصرى
شات بنات مصر
شات مصرى
بنات مصر
شات مصرى
شات بنات
شات مصر
شات مصرية

شات مصرية
شات مصريه

شات بنات مصر


HOT NEWS !!! GRATIS DAPATKAN UP-DATE 2015 Database Investor Indonesia AKTIVE 95% Valid Cocok Untuk Pemasaran & Promosi Bisnis Anda
Terdiri :: DAFTAR NAMA PENGUSAHA Kepemilikan Perusahaan Berskala Multi Nasional PERIODE 2015 & GRATIS PRODUK DIGITAL SOFTWARE MARKETING.
INDONESIA National Entrepreneur
Database Center 2015 :
BIG DATA MARKETING STRATEGY: Strategies for Using BIG DATA to WIN the Market and ENHANCE Relationships

Version 2015 UP-DATE Database Investor Indonesia 95% Valid Cocok Untuk Promosi

ADMIN 1 : (62) (0) 819 1653 9805
ADMIN 2 : (62) (0) 896 9040 7771 ( WHATSAPP )

DATA KOMPLIT ( PAKET 1 ) Versi 2015
HANYA Rp 188.000,- NETT
DATA KOMPLIT ( PAKET 2 ) Versi 2015
HANYA Rp 388.000,- NETT
HANYA Rp 500.000,- NETT

Tidak pernah ada bonus seperti ini, kami memberikan Bonus, bukan dari produk sampah atau tidak bernilai, tapi dari produk berharga yang PALING DICARI oleh para pebisnis di seluruh Indonesia Bonus yang kami berikan adalah :
Anda akan Mendapatkan
ADMIN 1 : (62) (0) 819 1653 9805
ADMIN 2 : (62) (0) 896 9040 7771 ( WHATSAPP )

Zero Bulb said...

Thanks. It works perfectly.
Zero Bulb
website designing in kerala
website designing in india
website development in kerala

akmal niazi khan said...

Programming is very interesting and creative thing if you do it with love. Your blog code helps a lot to beginners to learn programming from basic to advance level. I really love this blog because I learn a lot from here and this process is still continuing.
Love from Pro Programmer

akmal niazi khan said...

Blogging is incredible and every blogger playing a great role to introduce new things in blogging. I always like to fly on different blogs and read the strategies of different blogger to understand the blogging in more depth. Being a bloggers I really appreciate your works and no doubt your blog is awesome.
Love from Asad Niazi

Sonia Rizvi said...

Such a nice post dear, very helpful for me to doing SEO Service and you are doing well Blogging For SEO thanks you.

niaziakmal khan said...

Programming is combination of intelligent and creative work. Programmers can do anything with code. The entire Programming tutorials that you mention here on this blog are awesome. Beginners Heap also provides latest tutorials of Programming from beginning to advance level.
Be with us to learn programming in new and creative way.

Tom Dcruze said...

Its a very helpful information.
A well-managed email database is by far the best way to boost sales without risking budget waste because it appeals to consumers who have already opted in to receive marketing information from you. Germany Mailing Lists

hari andro said...

I am regular visitor of this blog .I am working as blog reviewer in a private press and I saw many useful posts here. Sure, I will give best ratings for this blog .Keep posting best posts like this to get top reviews and ratings from blog reviewers and people .And I am thankful for this valuable post.
Engineering Colleges in Chennai | Mechanical Colleges in Chennai | ECE Colleges in Chennai

sunitha vishnu said...

Really it was an awesome article...very interesting to read..You have provided an nice article....Thanks for sharing..
Android Training in Chennai
Ios Training in Chennai

Tester said...

Desktop Application Development Company in India

jhon lenon said...

want to read this interesting article for this month immediately click my article and get a great experience after reading my article on:
bandar judi online

jhon lenon said...

want to read this interesting article for this month immediately click my article and get a great experience after reading my article on:
bandar togel

jhon lenon said...

very interesting content of this article give inspiration thanks :

Unknown said...

Thank you Information that you convey is very useful, waiting for the next update friend, Greetings Success :)
dewa poker

Dhivya ravi said...
This comment has been removed by the author.
Dhivya ravi said...

Thank you for taking the time to provide us with your valuable information. We strive to provide our candidates with excellent care and we take your comments to heart.As always, we appreciate your confidence and trust in us
Billing Software in chennai

Monica Togelpelangi said...

article that very interesting me with this article

redhat b2b email List said...

Woooooooooooooooo super blog buys continue like this .................................
CEO Mailing List

Neena Joshi said...

Very Impressive Hadoop tutorial. The content seems to be pretty exhaustive and excellent and will definitely help in learning Hadoop course. I'm also a learner taken up Hadoop training and I think your content has cleared some concepts of mine. While browsing for Hadoop tutorials on YouTube i found this fantastic video on Hadoop. Do check it out if you are interested to know more.

ViralHarry said...

Get database languages information from here Database language

ranjith said...

Great article with excellent idea!Thank you for such a valuable article
Web design company in chennai
Web development company in chennai

pavithra Lakshmanan said...

Nice blog and too informative

Return gifts in Chennai

navratri gift items chennai

pavithra Lakshmanan said...

Nice blog and too informative

Return gifts in Chennai

navratri gift items chennai

Meena said...

I like your blog. Thanks for sharing.
SEO Company in Chennai
digital marketing company in chennai

Pavithra said...

I like your blog. Thanks for sharing.

manali tour package from chennai
shimla tour package from chennai
family holiday packages in india
family tour packages from chennai
goa packages from chennai
goa tour packages from chennai
holiday packages from chennai
tours and travels in chennai
tour packages from chennai
honeymoon packages from chennai
kerala tour packages from chennai
kerala trip from chennai
madurai one day tour package
munnar tour packages from chennai
north india tour package from chennai
one day tirupati package from chennai

Santhosh Kumar said...

Thank you for sharing a wonderful post.

Web Design Company in Chennai
Web Designing Company in Chennai
Website Design Company in Chennai
Website Designing Company in Chennai
SEO Company in Chennai

MaXab Jamal said...

Loved it share more please
Visa Pakistan
Media Tech Reviews

MaXab Jamal said...

Visa of Turkey from Pakistan

Subarna Ak said...

Awesome blog. I enjoyed reading your articles.

hotel management services

Ram Niwas said...

Thank you for sharing valuable information..

Website Design Company in Delhi
SEO Company in Delhi
Ecommerce Website Design Company in Delhi

Raj Kumar said...

Very interesting post!

SEO Company in Delhi
SEO Services in Delhi
SEO Services in India
Website Designing Company in Delhi

Unknown said...

Very useful article.
Ecommerce Web Development Company In Chennai
Digital Marketing Agency In Chennai