PDA

View Full Version : مقدار بولیین سه گانه



khadem1386
جمعه 23 بهمن 1388, 00:19 صبح
یک سوال :

سه تا رنگ دارم : قرمز آبی سبز

یک فیلد دارم از نوع Boolean یا bit
یک برنامه می خوام بنویسم که اگر مقدار فیلد null بود "تکس باکس" را قرمز کنه
اگر false بود آبی کنه و اگر True بود سبز کنه آیا این روش درسته؟

اگر اصولی نیست دقیقا بگید چه مشکلاتی را برای من در آینده بوجود می یاره؟
چه مشکلاتی بوجود می یاد

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

پس چگونه است که مقدار Boolean فقط یک bit مکان روی دیسک اشغال می کنه؟

سوال من در مورد عمل کرد و بنیان اساس MS SQL هست.

مرسی

sia_2007
جمعه 23 بهمن 1388, 03:48 صبح
ببین دوست عزیز ؛ در کامپیوتر و بالطبع آن Data Page های SQL Server ؛ کمترین مقداری که تخصیص میابد عملا بایت است.
بنا بر این یک Boolean 1 بایت فضا اشغال میکند.
مقادیر Null دردسرهای بسیار زیادی دارند.
بی نتیجه ساختن محاسبات ریاضی ؛ اخلال در کار کرسرها ؛ سختی اعتبارسنجی دیتا برای جلوگیری از خطای Concurrency در صورت استفاده نکردن از time Stamp ؛ و ...
اما در این طراحی شما Null جز دیتا شده است.
روش ساده استفاده از عدد 1 2 3 و یک Check Constraint است.
که مقادیر دیگری نگیرد.
یا استفاده از یک CLR Type

محمد سلیم آبادی
جمعه 23 بهمن 1388, 07:18 صبح
سوال من در مورد عمل کرد و بنیان اساس MS SQL هست
SQL Server و زبان SQL از یک منطق سه مقداری (Three Value Logic = 3VL) استفاده میکند. در منطق دو ارشی مقدار True است یا False ولی در SQL این منطق دارای سه مقدار True و False و Unknown است. که در جدول صحت (Truth table) یک سطر و ستون دیگه به جدول برای مقدار ناشناخته اضافه شده است. بر فرض اگر مقدار null را بخواهیم با مقدار دیگری مقایسه کنیم نتیجه ناشناخته خواهد بود که در اینجا ناشناخته به False تعبیر میشه.


یک فیلد دارم از نوع Boolean یا bit
یک برنامه می خوام بنویسم که اگر مقدار فیلد null بود "تکس باکس" را قرمز کنه
اگر false بود آبی کنه و اگر True بود سبز کنه آیا این روش درسته؟


از نظر عملی اینکار امکان پذیره ولی استفاده از NULL به این شکل کار صحیحی نیست. نوع داده را TIYINT بگیرید و سعی کنید از یک روش استاندارد (در مورد ISO در اینترنت جستجو کنید) برای ذخیره کردن رنگ ها استفاده کنید. مثلا برای ذخیره کردن جنیست افراد یک روش استاندارد (?????-ISO) وجود داره که شمارش یادم نیست که مثلا 0 برابر با مرد، 1 زن، 2 ناشناخته و ....

از ترکیب Computed Column و CASE داریم:


DECLARE @t TABLE( i BIT NULL, j AS CASE WHEN i IS NULL THEN 'red'
WHEN i=0 THEN 'bule'
WHEN i=1 THEN 'green' END);

INSERT @t VALUES (NULL); TINyint
INSERT @t VALUES (1);
INSERT @t VALUES (0);

SELECT * FROM @t
/*
i j
----- -----
NULL red
1 green
0 bule
*/

khadem1386
جمعه 23 بهمن 1388, 10:33 صبح
Three Value Logic چگونه توی یک bit جا می دند.

می دونید اول هدف من صرفه جویی است. این جوری که آقای msalim می گویند برای هر جدول یک جدول پنهان دیگه ای هست که مسول ثبت Null بودن فیدهاست.؟

دوم اینکه الان جدول من کلی رکور داره و یک فیلد جدید بهش اضافه کردم بنابراین همه مقدار های اون الان بروی null هستش. چطوری می تونم با یک دستور همه را مثلا true کنم؟

در مورد استفاده از iso ها آیا می شه مقاله ای به من معرفی کنید چون من اصلا از iso چیزی نمی دونم ولی می دونم که حدود 10 -15 تا data type داریم که احتمالا کوچکترینشان bit و بزرگترینشان MAX از نوع NVARChar هست.



بی نتیجه ساختن محاسبات ریاضی ؛ اخلال در کار کرسرها ؛ سختی اعتبارسنجی دیتا برای جلوگیری از خطای Concurrency در صورت استفاده نکردن از time Stamp ؛ و ...


آیا می شه در مورد اصطلاحات زیر توضیحات بیشتری بدهید (Concurrency یا time Stamp) این همزمانی که می گویید یعنی اگر جدول ما اطلاعات null زیاد داشته باشه ممکنه چندین کاربر نتونن همزمان با هم به دیتا بیس وصل بشند؟ و اخطلال پیش می یاد؟


مرسی از راهنمایی شما دوستان

محمد سلیم آبادی
جمعه 23 بهمن 1388, 11:08 صبح
Three Value Logic چگونه توی یک bit جا می دند.

می دونید اول هدف من صرفه جویی است. این جوری که آقای msalim می گویند برای هر جدول یک جدول پنهان دیگه ای هست که مسول ثبت Null بودن فیدهاست.؟

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


دوم اینکه الان جدول من کلی رکور داره و یک فیلد جدید بهش اضافه کردم بنابراین همه مقدار های اون الان بروی null هستش. چطوری می تونم با یک دستور همه را مثلا true کنم؟

Update table_name
Set Field = 1

در مورد استفاده از iso ها آیا می شه مقاله ای به من معرفی کنید

اینجا برای جنیست (http://en.wikipedia.org/wiki/ISO_5218) برای رنگ اصلا فکر نکنم همچین چیزی وجود داشته باشه.

روشی را که گفتم استفاده کردین؟ چرا از نوع داده ی TINYINY استفاده نمی کنید برای ذخیره رنگ؟

khadem1386
جمعه 23 بهمن 1388, 12:04 عصر
بر اساس توصیه دوستان از null استفاده نکردم. و همه را مقدار دهی کردم.

دستور Update کار ساز بود.

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

یک سوال خصوصی هم دارم :
اگر شما یک دیتا بیس داشته باشید و 25 فیلد داشته باشه و حدود 7-8 تا از اونها فعلا باهاش کار نداشته باشید. آیا اونها را Null رها می کنید. یا اینکه حتماحتما یک مقداری برای فیلدهاتون قرار می دید.
مثلا ممکنه 7-8 تا از فیلدها برای بعضی از قابلیتهای Web App است که قراره در آینده به web App تون اضافه بشه. یعنی توی دیتا بیس یک آدم خبره Null پیدا می شه یا نه؟


با تشکر

AminSobati
جمعه 23 بهمن 1388, 14:29 عصر
یک سوال :

سه تا رنگ دارم : قرمز آبی سبز

یک فیلد دارم از نوع Boolean یا bit
یک برنامه می خوام بنویسم که اگر مقدار فیلد null بود "تکس باکس" را قرمز کنه
اگر false بود آبی کنه و اگر True بود سبز کنه آیا این روش درسته؟

اگر اصولی نیست دقیقا بگید چه مشکلاتی را برای من در آینده بوجود می یاره؟
چه مشکلاتی بوجود می یاد

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

پس چگونه است که مقدار Boolean فقط یک bit مکان روی دیسک اشغال می کنه؟

سوال من در مورد عمل کرد و بنیان اساس MS SQL هست.

مرسی

سلام دوست عزیزم،
شما با این روش دارین از NULL بعنوان یک Value استفاده میکنین، در حالیکه NULL یک مفهومه، نه یک مقدار. NULL یعنی Unknown Value، یعنی مقدار این فیلد مشخص نیست. لذا اصرار نداشته باشید که از جنس Bit استفاده کنید. میتونین یک فیلد CHAR به طول 1 بایت تخصیص بدین و مقدار R یا G یا B ذخیره کنید

khadem1386
یک شنبه 25 بهمن 1388, 00:13 صبح
سلام :
بنده هم عرض کردم که از null استفاده نمی کنم. و برای موضوع سه گانه باید از چیزی به غیر از bit استفاده کرد.

اما سوال چدید من:
مساله اینجاست که جاهای دیگر بانک اطلاعاتی من بعضی از فیلها فعلا استفاده نمی شوند و بنابراین بصورت null باقی مانده اند. تا بعد که پروژه به فاز جدید برسد پرشود. ایا این مساله برای من ممکن است خطر آفرین باشد مثالا table دچار مشکل و ایراد بشود. این سوال را هم در بالا پرسیدم بود.

با تشکر

محمد سلیم آبادی
یک شنبه 25 بهمن 1388, 02:40 صبح
مساله اینجاست که جاهای دیگر بانک اطلاعاتی من بعضی از فیلها فعلا استفاده نمی شوند و بنابراین بصورت null باقی مانده اند. تا بعد که پروژه به فاز جدید برسد پرشود. ایا این مساله برای من ممکن است خطر آفرین باشد مسال table دچار مشکل و ایراد بشود. این سوال را هم در بالا پرسیدم بود.


همه چیز بستگی به نیاز سیستم دارد. گاهی نیاز است که ستون ها با مقدار پیش فرض مقدار دهی شوند بعضی مواقع اصلا نیازی نیست. اگر تعداد این ستون ها زیاد است میتوانید یک ارتباط یک به یک بوجود بیارید. یا در SQL Server 2008 از خاصیت Sparse (خلوت) استفاده کنید که برای مقدار NULL فضایی را اشغال نمی کند.

AminSobati
یک شنبه 25 بهمن 1388, 11:27 صبح
NULL بودن فیلدها در صورتیکه Query ما درست ازشون استفاده نکنه میتونه منجر به نتایج غلط بشه. ولی وقتی Query با آگاهی نوشته شده باشه چه خطری داره؟! اگر هم نگران فضای اضافه هستید، میتونین طبق پیشنهاد پست قبلی از خاصیت Sparse استفاده کنید. ولی به یاد داشته باشید باید درصد قابل توجهی از فیلد NULL باشه تا Sparse به صرفه بشه. فیلد Sparse اگر به جای NULL دارای مقدار باشه، کمی Overhead اضافی خواهد داشت (از لحاظ فضا) در مقایسه با حالتی که خاصیت Sparse نداره. حداقل 40 درصد از رکوردهای شما در اون فیلد باید NULL باشن تا تقریبا 50 درصد فضا صرفه جویی بشه.