(۱۳۹۷ خرداد ۰۲, ۰۸:۲۲ ق.ظ)Sat0ri نوشته: (۱۳۹۷ خرداد ۰۲, ۰۵:۱۵ ق.ظ)Version نوشته: مشکل در طراحی دیتابیس دارین یا در برنامه نویسی پروژه؟
توضیح کوتاه زیر رو بخونین، اگه نیاز بود بگین مشکلتون با کدوم قسمته تا بیشتر توضیح بدم
در طراحی دیتابیس:
شما تعدادی فایل موسیقی دارین، پس بهتره یه تیبل برای نگهداری اسم و مشخصات فایلهای موسیقی داشته باشین. (فایلهای اگه داخل چند دایرکتوری باشن، اینم میشه داخل همین تیبل)
کاربراتون نیاز به یک تیبل جدا دارن که قطعا انجامش دادین.
حالا هر پلیلیست شامل تعدادی آهنگه، پس باید یه ظرف یعنی تیبل برای نگهداری اسم و مشخصات پلیلیست و یک تیبل برای نگهداری رابطه بین تیبل پلیلیست و موسیقیهای مورد نیاز و یک تیبل برای تخصیص هر پلی لیست به کاربر مورد نظر داشته باشین.
ساختار زیر یه ساختار ساده برای درک بهتر این موضوع است:
کد:
musics
id
music_name
singer
users
id
email
username
playlists
id
playlist_name
created_at
music_playlist
playlist_id
music_id
playlist_user
playlist_id
user_id
در مورد کد بالا،
هر جا که از آندرسکور و بعدش id استفاده کردم، باید primary key باشن.
و Foreign key بشه به ستون id از تیبل مورد نظر.
و البته همینو در صورت نیاز میتونین واسه خوانندهها هم بسط بدین.
اگه پلیلیستها خصوصی هستن و قابل اشتراکگذاری نیستن، نیازی به تیبل نگهدارنده رابطهها نیست و کافیه داخل تیبل پلیلیست یه ستون برای user_id بزارین.
در قسمت برنامه نویسی هم ارتباط یک به چند (یک یوزر به چند پلیلیست و ...) و با join کردن مشکلی باقی نمیمونه.
توضیح بالا خیلی ساده بود، فقط جهت اینکه بفهمیم مشکلتون کدوم قسمته. و بعد همون قسمت رو بیشتر توضیح بدم. طراحی دیتابیس مشکل دارین یا برنامه نویسی؟
لطفا پست چگونه پاسخ مشکل خود را سریع بیابیم رو مطالعه کنین، اینجوری سریعتر پاسخ سوالاتتون رو میگیرین.
موفق باشید.
بابت لحن و توضیحات عالیتون خیلی خیلی ممنونم من هرجا سوالم رو پرسیدم با ی لحن خیلی بد برخورد کردن واقعا شما فرد لایق و با شخصیتی هستین

من قسمت اول مشکلم که اینکه ساختاری که قراره توی DB ایجاد بشه چجوری باید باشه حل شد فقط اگر کاربر بخواد انتخاب کته که این Playlist خصوصی باشه یا عمومی چجوری باید چنین کاری انجام بشه ؟ (اگر اشکالی نداشته باشه ی مثال خیلی ساده با کد PHP روی این موضوع و نحوه ارسال اطلاعات در دو صورت Private و Public به دیتابیس چگونه باشه )
و اینکه این موسیقی مثلا در سرور در این آدرس قرار داره :
کد:
http://site.com/stream/music1.mp3
این فایل رو چطور باید اطلاعاتش رو در دیتابیس وارد کنم؟
الان به درک اینکه تو ی سرویس استریم موزیک مثل SoundCloud چطور دیتابیس ساختارش تعیین میشه فقط این سوال بالا ی درک خوب بهم از کد زدنش میده
کد:
در قسمت برنامه نویسی هم ارتباط یک به چند (یک یوزر به چند پلیلیست و ...) و با join کردن مشکلی باقی نمیمونه.
اگر ی مثال ساده PHP بزنید عالی میشه واقعا
پیشاپیش بابت وقتی که برای سوالم میذارید ممنونم
خواهشکنم، خیلی ممنون از لطفتون، بزرگوارید.
داخل تیبل playlist یک ستون دیگه بزارید و اسمشو مثلا بزارید is_private و چون یا عمومی هست یا خصوصی، بهتره نوعش بولین باشه. مقدار دیفالت رو بزارین 0 یعنی به طور پیشفرض همه پلیلیستها عمومی باشن مگه کاربر بخواد خصوصی باشه. وقتی از دیتابیس پلیلیست بگیرین، 0 رو برای عمومی و 1 رو برای خصوصی در نظر بگیرین.
اگه بخوایم ذخیره کنیم داده رو با چک لیست از کاربر میپرسیم که اگه میخوای خصوصی باشن، تیک چک لیست رو بزن اگه نه عمومی در نظر میگیریم.
خب، بهترین راه اینه که یه فرم داشته باشین، داخلش فیلدهای مورد نیازتون رو تعریف کنین. حالا برای آپلود هم یه input جداگانه دارین، البته اگه فایلها قبلا یا به روش دیگهای روی سرور آپلود میشن، input میتونه URL نسبی یا مطلق بگیره و نیازی به آپلود نیست. یا ترکیبی از هر دو سولوشن رو استفاده کنین.
یه مشکلی که شاید اذیت کنه تعداد فایلها است که احتمالا زیاد باشه حوصله نداشته باشین، راهحل اونم استفاده از فیلدهای داینامیکه که میشه فیلدهای غیر مشترک مثل نام موسیقی رو به انتهای فرم اضافه کرد و بعد یکجا گرفت فقط فراموش نکنین که name رو حتما به صورت آرایه نامگذاری کنین، مثلا فیلد نام موسیقی:
کد پیاچپی:
<input type="name" name="musicName[]">
وارد کردن اطلاعات در دیتابیس
اول این مورد، وارد کردن اطلاعات کار سختی نیست. فرض کنیم کاربر یک پلیلیست بخواد بسازه. خب پلیلیست رو با نام و مشخصات مورد نظر در تیبل مورد نظرتون وارد کنین و بعد یه رکورد هم وارد تیبل playlist_user کنین که یوزر رو از id کاربر لاگین جاری و playlist_id رو هم از result کوئری قبلی بگیرین و تموم! فقط فراموش نکنین که با یه شرط چک کنین که کوئری اول موفق ذخیره شده باشه.
ولی یه مشکلی وجود داره، اگه وسط ذخیره سازی رکورد دوم مشکلی پیش اومد، خب تکلیف چیه؟ ما یه پلی لیست داریم که صاحب نداره و یا باید دوباره ساخته بشه یا owner برای تغییر در آینده نداره. راهحل موضوعی به نام ترنزکشن هستش، قبلا داخل
سکان آکادمی نوشتم دربارش که گرچه توضیحاتش کامله، اگه نیاز بود بیشتر توضیح میدم. (مثال هم داره - متاسفانه دیگه با اون سایت همکاری ندارم ولی بزودی بخش مشابهی در سایت خودم ایجاد میکنم و حتما خیلی کاملتر توضیح میدم.)
البته ترنزکشن پرفورمنس رو هم تا حد قابل توجهی بهتر میکنه.
یه موردی که بهتره رعایت کنین داشتن ستونی برای Owner است چون بعدا فهمیدن اینکه کدوم پلیلیست رو کی میتونه تغییر بده سخت میشه.
خواندن اطلاعات از دیتابیس
حالا خواندن اطلاعات، خب فرض کنیم پلیلیست کاربر جاری رو نیاز دارین، حالا از طریق سشن یا دیتابیس id کاربر رو دارین، خب باید یه کوئری بزنین به شکل زیر:
البته همین کوئری هم سختگیر باشین یا تعداد ریکوئستها زیاد باشن، میشه بهینه کرد تا پرفرمنس بهتری داشته باشه.
کد پیاچپی:
SELECT *
FROM `playlist_user`
LEFT JOIN `playlists`
ON `playlist_user`.`playlist_id` = `playlists`.`id`;
WHERE (`user_id` = '{$id}')
چیز خاصی نیست، مثل result کوئری معمولی است.
دو تا نکته:
1. در تقابل استفاده از php و mysql بهتره از mysql استفاده کنین چون به مراتب پرفرمنس بهتری داره.
2. فیلدهای از نوع عدد صحیح که مقدار منفی ندارن، مثل timestamp و id رو unsigned بزارین و حتما باید اون فیلدهایی که بهشون foreign key میشن هم unsigned باشن.
خوشحالم که بدردتون خورد.
موفق باشین.