The need to design an optimally distributed database is increasingly important with the growth of information technology and computer networks. However, designing a distributed database is an extremely complex process due to a large number of geographically distributed sites and database relations. Moreover, decreasing communication costs and query response time should be taken into consideration. There are three main techniques applied to design a distributed database, namely Fragmentation, Data allocation, and Replication. It is notable that these techniques are often treated separately and rarely processed together. Some available allocation methods are applied regardless of how the fragmentation technique is performed or replication process is adopted. In contrast, other fragmentation techniques do not consider the allocation or the replication techniques. Therefore, the first and foremost step for designing an optimal database is to develop a comprehensive understanding of the current fragmentation, replication, and allocation techniques and their disadvantages. This article presents an attempt to fulfill this step by proposing a comprehensive taxonomy of the available fragmentation and allocation techniques in distributed database design. The article also discusses some case studies of these techniques for a deeper understanding of its achievements and limitations.