سلام دوستان خسته نباشید.
من می خوام برای یک سایت فروشگاهی که بکش با node هست از مانگو دی بی استفاده کنم.اما اصلا نمی دونم باید چطوری اسکیما هارو بنویسم و دیتابیس رو طراحی کنم.
مثلا کامنت های کاربر باید یک کالکشن جدا باشه و با فیلدی به نام id که منظور id کاربر هست به کاربر متصل بشه و از طریق این فیلد کامنت های هر کاربر دریافت بشه و یا کامنت ها خودشون یک فیلد در اسکیما کاربر باشه.چون اگر کالکشن جدا باشه اونوقت عملیات دریافتشون برای ادمین راحت تره و با یه دستور می تونه همه ی کامنت ها رو دریافت کنه اما اگر جزئی از اسکیما کاربر باشه ، ادمین برای این که کامنت ها رو در پنل خودش دریافت کنه باید طی اون دستور get تک تک کاربرا بررسی بشن کامنت ها شون در صورت وجود سرهم بشن و بعد نمایش داده بشوند. خوب این کار بیشتری می بره و سرعت کمتر و بار سرور بیشتر میشه.من خیلی بک اند کار نیستم اما فکر می کنم درست می گم.
اصلا قاعده و قانون طراحی دیتابیس چیه؟
ممنون می شم اگر منبعی برای توضیحات این مدلی بلد هستید لینکشو برام قرار بدید.
با mysqli که من انجام میدم میام ی جدول میسازم مثلا User comments بعد این جدول با جدول هایی که به user مرتبط هستش Join میشه طبق چی طبق آیدی کاربر
مثلا تو جدول user comments ی ستون داریم بنام uid یا همون userid بعد آیدی این کاربر با ایدی کاربر که تو جدول user هستش چک میشه جوین میشه و داده ها دریافت میشه در واقع با یک کویری میشه به چندین جدول و کلی دیتا دسترسی پیدا کرد
من sql بلد نیستم. فکر می کنم فرق می کنه با nosql.
این طوری که شما می گید کامنت ها می شن یه کالکشن جدا و فیلدی به نام userid وجود داره که مشخص می کنه این کامنت برای کدوم کاربره.این روش کار می کنه اما تو noqsl چون رابطه ای بین کالکشن ها نیست کار شاید زمان بر بشه. مثلا اگر 1000 کامنت یه سایت داشته باشه و فقط یکیش برای یک کاربر خاص باشه باید با هر بار درخواست همه ی 1000 تا بررسی بشوند. این کار از نظر شما درسته ؟ مشکلی نداره؟
سلام وقت بخیر
دوست عزیز میتونی یه کالکشن بزنی به اسم comments و توی اون فیلد user بدی بعد اونو ربط بدی به یه ایدی از کالکشن یوزر که زمانی که یوزر کامنت رو میزنه توی اون فیلد ایدیش ذخیره بشه و ایدی محصول که از محصولات گرفته میشه توش ذخیره بشه اینجوری هم میتونی کامنتای محصول رو لود کنی هم میتونی کامنتی که مربوط به کاربر هست رو بگیری کدش ایجاد اسکیما هم این میشه واسه ریلیت کردنشون
const commentsSchema = Schema({
message: {
type: String,
required: 'message is Required!'
},
product: {
type: mongoose.Schema.Types.ObjectId,
required: "Product is Required!",
ref: "Product"
},
user: {
type: mongoose.Schema.Types.ObjectId,
required: "User is Required!",
ref: "User"
}
},{
timestamps: true
});
این یه نمونه هست که message کاربر رو به صورت متن میگیره و ایدی پروداکت رو باید بهش بدی موقعه زدن کامنت و ایدی کاربر که مشخصه که تایپش ابجت ایدی هست که تایپ ایدی های داخل mongodb هست توی mysql از عدد شروع میکنه میره بالا اما mongodb ساختار ایدیش پیچیده تر هست و برای سیو کردنش باید تایپش رو objectid و با یک رفنرس و منبع از یه کالکشن دیگه درنظر بگیری بعدش دیگه خیلی راحت میشه لود کردنشون مثلا میگی همه کامنت هایی که product برابره با این ایدی product بیان و لود بشن یا کامنتای کاربر خاصی که برای یک پروداکت خاص هس رو لود بکنه یا کلا کامنتای این کاربر رو لود بکنی خیلی ساده میشه
الان در این کد تایپ رو objectid مشخص کردید .
پس ref رو برای چی قرار دادید.
id از سمت فرانت میاد و از اونجایی که کاربر بهش دسترسی نداره قطعا ایدی درستی باید باشه پس کار ref چیه؟
خوب تایپ مشخص میکنه چی قراره توش جا بشه عدد رشته یا هرچی تایپ objectid مخصوص mongodb هست چون ایدی های کاکشن ها متاوفت هست تایپشون باید تایپ objectid رو باید بدی بعد ref میگه این ایدی رو قراره از کدوم کاکلشن بگیرم مخفف رفرنس هست
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟