احسان رضایی

یک توسعه دهنده

مدل سازی داده و طراحی پایگاه داده چند زبانه

در PHP , پایگاه داده , / تاریخ ارسال 23-01-1398 / 3 نظر / آخرین ویرایش 28-08-1403

Multiple Languages

توسعه دهندگان نرم افزار همیشه علاقمند به گسترش فعالیت و رفتن به سمت بازار های جدید هستن. به این معنی که سعی میکنن محصولات خودشون رو در مناطق مختلف قرار بدن. در این مطلب چند روش برای بومی سازی یا مدل سازی داده و طراحی پایگاه داده چند زبانه توضیح داده میشه. مخصوصا بومی سازی در سطح محتوای نرم افزار.

بومی سازی یا محلی سازی به فرآیند تطبیق محصول در بازار های مختلف گفته میشه. این یه موضوع مهم برای دستیابی و فروش در سایر بازار هاست. با این فرآیند کاربران احساس میکنن که یک محصول برای زبان، فرهنگ و نیاز اونها تولید شده.

زمانی که درباره بومی سازی فکر میکنیم در درجه اول ترجمه محتوا ذهن ما رو به خودش مشغول میکنه. ما نیاز به یک مدل پایگاه داده قوی و کارآمد برای ذخیره محتوای ترجمه شده در چندین زبان داریم.

برای درک بیشتر و با توجه به نیاز های مختلف روش های متفاوتی رو بررسی میکنیم. هر کدوم از این روش ها مزایا و معایب خودشون رو دارن. در نتیجه انتخاب بر عهده ی شما و نیازمندی های خاص خودتون هست.

روش اول - اضافه کردن ستون زبان برای هر فیلد.

 ساده ترین روش از نظر توسعه و طراحی. کافیه برای هر زبان داخل جدول یک ستون در نظر بگیرید.

روش اول - مدل سازی داده و طراحی پایگاه داده چند زبانه

مزایا.

- پیاده سازی ساده.

- هنگام نوشتن SQL Query هیچ پیچیدگی خاصی وجود نداره. مثلا:

Select p.product_name_FR, p.description_FR, p.price, 
       c.name_FR, c.address_FR, c.contact_name 
from order_line o, product p, customer c
    Where o.product_id = p.id and o.customer_id = c.id
    And id = <order number>;
معایب.

- عدم وجود مقیاس پذیری. هر زمان که زبان جدیدی اضافه بشه باید ستونش رو داخل جدول بسازید.

- وقت گیر هست اگر زبان های زیادی در سیستم داشته باشید.

روش دوم - ایجاد جدول جداگانه برای ترجمه(translation table).

در این روش یک جدول جدا برای ترجمه محتوا در نظر میگیریم(جدول translation). که شامل یک ستون به ازای هر زبان هست.

روش دوم - مدل سازی داده و طراحی پایگاه داده چند زبانه

مزایا.

- برای یک مدل داده ی از قبل آماده شده روش خوبی به منظور پیاده سازی هست.

- تغییرات در صورت اضافه شدن زبان جدید به علت یک جدول ترجمه مجزا آسون تر هست.

- میشه متون تکراریُ فقط یک بار ترجمه و سپس از شناسه اون در جداول مختلف استفاده کرد.

معایب.

- اگر یکی از مدل ها فقط یک زبان را پشتیبانی کنه یا یک فیلد تمام زبان ها رو برای ترجمه نیاز نداشته باشه، مشکل مقادیر NULL در جدول زبان به وجود میاد.

- به دلیل JOIN با جدول ترجمه در صورتی که رکورد های زیادی داخل این جدول وجود داشته باشه. SQL Query کند میشه. یه راه حل برای این موضوع جدا کردن جدول ترجمه به ازای هر جدول هست.

روش تکمیلی دوم - مدل سازی داده و طراحی پایگاه داده چند زبانه

روش سوم - یک جدول ترجمه همراه با یک سطر به ازای هر زبان.

شبیه به روش قبلی هست با این تفاوت که زبان ها رو به جای قرار دادن در ستون، به صورت ردیف میبینیم.

روش سوم - مدل سازی داده و طراحی پایگاه داده چند زبانه

مزایا.

- نوشتن SQL Query های مربوط به بازیابی داده ها آسون تر هست.

- نوشتن OEM برای مدل راحت تره.

- هنگام اضافه شدن زبان جدید تغییراتی لازم نداریم. فقط کافیه اطلاعات زبان جدید رو اضافه کنیم.

- بازیابی اطلاعات کاهش پیدا میکنه. مثلا: 

SELECT tp.text,
        p.price,
       tc.text,
        c.contact_name
FROM order_line o, product p, customer c, translation tp, 
     translation tc, language l
	WHERE o.product_id = p.id AND o.customer_id = c.id
	AND p.name_translation_id = tp.id
	AND c.name_translation_id = tc.id
             AND tp.language_id = l.id
             AND tc.language_id = l.id
             AND l.name = @in_language
	AND id = <order number>;
معایب.

- باز هم به دلیل یک جدول ترجمه واحد مشکل حجم زیاد این جدول وجود داره. برای حل این مشکل میتونیم جدول ترجمه رو به ازای هر جدول ببینیم. تا حجم اطلاعات این جدول شکسته بشه.

روش چهارم - ایجاد Entity Layer برای فیلد هایی که نیاز به ترجمه دارن و اونهایی که نیاز ندارن.

توی این روش هر جدول تقسیم به دو جدول میشه. یکی شامل فیلد هایی که باید ترجمه بشن و یکی اونهایی که نیازی به ترجمه شدن ندارن. به این ترتیب لایه های جداگانه ای برای هر کدومشون ایجاد میشه.

روش چهارم - http://www.developit.ir/file/download/WewBQ

مزایا.

- عملیات JOIN شکسته میشه. یعنی اگر نیاز به جدول فیلد های ترجمه نباشه هنگام JOIN عملکرد بهتری خواهیم داشت.

- برای بازیابی فیلد های ترجمه به JOIN های کمی نیاز داریم.

- نوشتن راحت تر OEM.

- SQL Ouery های ساده تر برای متون ترجمه.

SELECT pt.product_name, pt.description, p.price
FROM order_line o, product p, product_translation pt, language l
	WHERE o.product_id = p.id AND 
	AND p.id = pt.product_non_trans_id
	AND pt.language_id = l.id
               AND l.name = @in_language
	AND id = <order number>;

- یک روش استاندارد برای چند زبانگی بین موجودیت هاست.

منبع.

 

پیشنهاد

کتاب‌ها

کتاب الگوهای طراحی به بیان ساده(design patterns / دیزاین پترن)

در مهندسی نرم افزار، design patterns(الگوهای طراحی) راه حل‌های قابل استفاده برای مشکلاتی هستند که معمولاً در طراحی نرم‌افزار اتفاق می افتند.

طرح های از پیش ساخته شده‌ای که می‌توانید برای حل مشکلات آن‌ها را سفارشی کنید. شما نمی‌توانید یک الگو را با جستجو در stackoverflow پیدا و در برنامه خود کپی کنید. الگو ها یک قطعه کد خاص نیستند، مفاهیم کلی برای حل مشکلات خاص هستند. شما باید با درک این مفاهیم آن‌ها را در برنامه خود پیاده‌سازی کنید.

کتاب refactoring / ریفکتورینگ

Refactoring مجموعه‌ای از تکنیک‌هاست که به منظور اصلاح و بهبود کدهای قبلی بدون تغییر در عملکرد و رفتارشان جهت خوانایی، کارامدی و قابلیت نگهداری بیشتر انجام می‌شود.

در کتاب Refactoring اثر Martin Fowler نوشته شده: refactoring تکنیک مرتب/منظم سازی برای تجدید ساختار کد موجود است. تغییر ساختار داخلی کد بدون تغییر رفتار خارجی آن.

refactoring یک سرمایه‌گذاری و راه حلی برای مقابله با کد کثیف و بدهی فنی است که باعث کاهش هزینه‌های توسعه نرم‌افزار در آینده خواهد شد.

ارسال نظر

رضا در تاریخ 1398/07/29 - 16:28 نوشته
جالب و کاربردی بود ممنون. هلاک روش اول شدم :)) فقط روش آخر یه خرده سخت شد. بدجور نیست اینطوری همه چی پر و پخش میشه؟
پاسخ احسان:

خواهش میکنم.
از ساده به سخت شروع شده دیگه :))
من خودم برای دو تا پروژه از روش اخر استفاده کردم، روش خوبیه. خروجی تمیزی هم برای rest api میتونی داشته باشی. در کل مزیت هایی که بهت میده از عیب هاش بیشتره.

مهدی در تاریخ 1398/10/18 - 01:56 نوشته
خیلی عالی و کاربردی روش سوم رو میپسندم استفاده کنم هم قابل فهم بود و هم نسبت به دو روش اول بهتر البته روش چهارم رو متوجه نشدم چی به چی
محمدرضا در تاریخ 1399/03/08 - 02:22 نوشته
باحال بود ولی یه روش هم میتونه این باشه که مونگو استفاده بشه و مثلا نام به صورت ارایه ای از زبان ها داشته باشیم