نوشته شده توسط
تبسم ساینا
سلام
در توضیحات پروژه ای که باید بنویسم نوشته شده که :
کد HTML:
یک سیستم فیلد سفارشی هم در نظر بگیرید که موجودیت ها به صورت مستقیم یا غیر مستقیم می توانند از آن استفاده کنند.
به عنوان مثال محصول بر حسب دسته بندی فیلد هایی به آن اضافه می شود.و کاربر بر حسب نیاز شرکت فیلدی مثل کد ملی را به کاربر اضافه می کند و کاربر را موظف به وارد کردن این فیلد می کند.
مثال برای محصول بر حسب دسته بندی ضد یخ،فیلد تاریخ انقضا دارد.
خواستم راهنمایی کنید که چجوری این فیلد رو در پروژه ایجاد کنم؟
به این میگین طراحی دینامیک یا پویا. یعنی شما یکسری کالا داری که یکسری خصوصیات دارن که برخی خصوصیات مشترک و برخی منحصر به فرد هستند. پس از ابتدا نمیدونید که چه تعداد خصوصیت دارین که براش ستون در نظر بگیرین.
برای مثال فروشگاهی رو در نظر بگیرین که هم موبایل میفروشه هم کفش و هم عطر. حالا جدول کالا باید چه ستونهایی داشته باشه؟ موبایل خصوصیت "تعداد سیم کارت" داره ولی عطر همچین خصوصیتی نداره. این یعنی ناهمگن بودن خصوصیات موجودیت
در اینحالت شما باید یک جدول داشته باشین که خصوصیات رو نگه داره (مثلا رنگ، وزن، تاریخ انقضا، حجم، تعداد سیم کارت و ...) و یک جدول برای ثبت خصوصیت و مقدارش. دیاگرام زیر نحوه پیاده سازی کامل این سیستم هست:
جدول Categories مربوط به دسته بندی کالاها هست: مثلا لوازم الکترونیکی، پوشاک و ...
جدول Products مربوط به کالاعا هست: مثلا روکش ماشین، روغن ترمز، ساعت، موبایل و ...
جدول Properties برای نگهداری ویزگی ها استفاده میشه. مثلا: رنگ، وزن، حجم و ...
جدول ProductProperties برای نگهداری خصوصیات هر کالا استفاده میشه: مثلا کالای شماره 1 دارای خصوصیت شماره 1 هست و مقدارش هست قرمز، کالای شماره 1 دارای خصوصیت شماره 5 هست و مقدارش هست 250 گرم
جدول CategoryProperties هم به عنوان یک جدول کمکی میشه ازش استفاده کرد که بگه هر گروه کالا چه خصوصیاتی داره مثلا گروه تلفن همراه خصوصیات شماره 1 و 2 و 3 رو داره که از جدول خصوصیات مقدار میگیره
در این نوع طراحی مشکل زمانی پیش میاد که شما میخواین اطلاعات ذخیره شده بصورت سطری (در اینجا خصوصیات) رو بصورت ستونی نمایش بدین در این حالت باید از T-Sql خاص و پیشرفته استفاده کنید. یک نمونه از واکشی اطلاعات رو در کوئری زیر میبنید:
DECLARE @Columns AS NVARCHAR(MAX);DECLARE @Query AS NVARCHAR(MAX);
SELECT @Columns = STUFF(
(
SELECT ', ' + QUOTENAME(Properties.Name)
FROM Properties INNER JOIN CategoryProperties ON Properties.PropertyId = CategoryProperties.PropertyId
WHERE CategoryId = 1
FOR XML PATH('')
), 1, 1, '')
SET @Query = 'SELECT * FROM
(
SELECT pro.ProductId, pro.Name AS ProductName, p.Name, pp.Value FROM ProductProperties pp
INNER JOIN Properties AS p ON pp.PropertyId = p.PropertyId
INNER JOIN Products AS pro ON pro.ProductId = pp.ProductId
WHERE pro.CategoryId = 1
) d
PIVOT
(
MAX(Value)
FOR Name IN (' + @Columns + ')
) piv';
EXEC sp_executesql @Query;
و برای کمک بیشتر نمونه پایگاه و کوئری بالا بطور کامل: