در این مقاله قصد داریم اطلاعات مفیدی را در مورد طراحی دیتابیسهای چند زبانه، در اختیار شما بگذاریم. مدتی قبل به طراحی دیتابیسی که چند زبانه بودن توضیحات کالا را برای مشتریانی از کشورهای مختلف پشتیبانی میکرد، نیاز داشتم. وقتی شروع به پیاده سازی طرح دیتابیس کردم، جواب سرراست نبود. زمانیکه در وب برای بهترین راه جستجو میکردم، با نظرات و روشهای زیادی مواجه شدم. در ادامه بعضی از روشهای محبوب را بیان میکنم.
ستون اضافی : این سادهترین راه است و به ازای هر ستونی که نیاز به ترجمه داشته باشد، ستون اضافی در نظر میگیریم.CREATE TABLE app_product ( Id Int IDENTITY NOT NULL, Description_en Text, Description_pl Text, PRIMARY KEY (Id) );
مزایا :
- سادگی
- کوئریهای آسان (بدون نیاز به join )
معایب :
- اضافه کردن زبان جدید نیاز به تغییر جداولی
که چند زبانه هستند دارد
- اگر وارد کردن داده برای همه زبانها الزامی
نباشد (بعضی جاها فقط زبان پیش فرض الزامی است) ممکن است دادههای زیاد و یا فیلدهای خالی در دیتابیس ایجاد شود
- نگهداری آن مشکل است
CREATE TABLE ref_language ( Code Char(2)NOT NULL, Name Varchar(20) NOT NULL, PRIMARY KEY (Code) ); CREATE TABLE app_translation ( Id Int IDENTITY NOT NULL, PRIMARY KEY (Id) ); CREATE TABLE app_translation_entry ( TranslationId Int NOT NULL, LanguageCode Char(2) NOT NULL, Text Text NOT NULL, FOREIGN KEY (TranslationId) REFERENCES app_translation(Id), FOREIGN KEY (LanguageCode) REFERENCES ref_language(Code) ); CREATE TABLE app_product ( Id Int IDENTITY NOT NULL, Description Int NOT NULL, PRIMARY KEY (Id), FOREIGN KEY (Description) REFERENCES app_translation(Id) );
مزایا :
- اضافه کردن زبان جدید به تغییر طرح دیتابیس
نیاز ندارد
- به نظر تمیز است و رویکرد رابطهای دارد
- همه ترجمهها در یک مکان است (بعضیها میگویند این جز معایب است چون امکان خوانایی و نگهداری کمتر است)
معایب :
- کوئریهای پیچیده (به join های چندگانه نیاز دارد تا شرح کالا را به درستی نمایش دهد)
- پیچیدگی زیاد
CREATE TABLE ref_language ( Code Char(2)NOT NULL, Name Varchar(20) NOT NULL, PRIMARY KEY (Code) ); CREATE TABLE app_product ( Id Int IDENTITY NOT NULL, PRIMARY KEY (Id) ); CREATE TABLE app_product_translation ( ProductId Int NOT NULL, LanguageCode Char(2) NOT NULL, Description Text NOT NULL, FOREIGN KEY (ProductId) REFERENCES app_product(Id), FOREIGN KEY (LanguageCode) REFERENCES ref_language(Code) );
مزایا :
- اضافه کردن زبان جدید به تغییر طرح دیتابیس
نیاز ندارد
- کوئریهای نسبتا ساده است
معایب :
- ممکن است تعداد جداول دو برابر شود
سه مثال نشان داده شده در بالا به ما ایده میدهند که چگونه روشهای مختلف ممکن است استفاده شوند. البته اینها همه گزینههای ممکن نیستند، فقط محبوبترین روشها هستند و شما میتوانید آنها را ویرایش کنید؛ به عنوان مثال با تعریف View های اضافی که join های پیچیده شما را در کدها، ذخیره میکنند. راه حلی که شما انتخاب میکنید به نیازمندیهای پروژه وابسته است. اگر شما به سادگی نیاز دارید و مطمئن هستید تعداد زبانهای پیشتیبانی کم و ثابت است، میتوانید راه حل اول را انتخاب کنید. اگر به انعطاف پذیری بیشتری نیاز دارید، میتوانید join های ساده در کوئریهای چند زبانه را انتخاب کنید. راه حل سوم انتخاب مناسبی است.
منبع :
http://fczaja.blogspot.com/2010/08/multilanguage-database-design.html