# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > ارزیابی نرم افزار > سوال: منظور از فیلد سفارشی در پروژه چیست؟

## تبسم ساینا

سلام
در توضیحات پروژه ای که باید بنویسم نوشته شده که :


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

خواستم راهنمایی کنید که چجوری این فیلد رو در پروژه ایجاد کنم؟

----------


## alireza_s_84

> سلام
> در توضیحات پروژه ای که باید بنویسم نوشته شده که :
> 
> 
> ```
> یک سیستم فیلد سفارشی هم در نظر بگیرید که موجودیت ها به صورت مستقیم یا غیر مستقیم می توانند از آن استفاده کنند.
> به عنوان مثال محصول بر حسب دسته بندی فیلد هایی به آن اضافه می شود.و کاربر بر حسب نیاز شرکت فیلدی مثل کد ملی را به کاربر اضافه می کند و کاربر را موظف به وارد کردن این فیلد می کند.
>               مثال برای محصول بر حسب دسته بندی ضد یخ،فیلد تاریخ انقضا دارد.
> ```
> ...


به این میگین طراحی دینامیک یا پویا. یعنی شما یکسری کالا داری که یکسری خصوصیات دارن که برخی خصوصیات مشترک و برخی منحصر به فرد هستند. پس از ابتدا نمیدونید که چه تعداد خصوصیت دارین که براش ستون در نظر بگیرین. 
برای مثال فروشگاهی رو در نظر بگیرین که هم موبایل میفروشه هم کفش و هم عطر. حالا جدول کالا باید چه ستونهایی داشته باشه؟ موبایل خصوصیت "تعداد سیم کارت" داره ولی عطر همچین خصوصیتی نداره. این یعنی ناهمگن بودن خصوصیات موجودیت
در اینحالت شما باید یک جدول داشته باشین که خصوصیات رو نگه داره (مثلا رنگ، وزن، تاریخ انقضا، حجم، تعداد سیم کارت و ...) و یک جدول برای ثبت خصوصیت و مقدارش. دیاگرام زیر نحوه پیاده سازی کامل این سیستم هست:

جدول 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;

و برای کمک بیشتر نمونه پایگاه و کوئری بالا بطور کامل:

----------


## تبسم ساینا

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

----------


## alireza_s_84

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


شما هرکجا نیاز به چنین خصوصیاتی داشتین باید تفکیک مناسب (نرمالسازی) رو انجام بدین. همچنین موجودیتهای "محصول" و "کاربر" کاملا باهم متفاوت هستن پس جداول متفاوتی هم خواهند داشت.
برای پیاده سازی هم میتونید از EF استفاده کنید و کوئری رو مستقیم اجرا کنید. نتیجه برگشتی رو بصورت یک شی dynamic میتونید به View بدین و Html مورد نیاز رو ایجاد کنید.

----------

