PDA

View Full Version : پياده سازي تخصص ها و برچسب ها



bmanfy
جمعه 13 آبان 1390, 09:48 صبح
سلام دوستان .
در جدول اول يك فيلد دارد كه مقادير زير درون اون ثبت شده


ali reza majid hadi karim

يه جدول ديگه هم دارم كه يك فيلد داره كه مقادير زير درون اون ثبت شده


hashem sadegh reza javad zahra

اگر دقت كنيد تو اين دوتا فيلد مقدار rezaمشترك است.
چطور ميتونم يك كوئري بنويسم كه بر اساس جدول اول اون چيزايي كه تو جدول دوم هست رو برام پيدا كنه
اصل موضوع و توضيحات بيشتر:
فيلد در جدول اول تخصصهاي يك شخص است
فيلد در جدول دوم برچسب هاي يك سوال
حالا قراره برچسبها رو ببينم و سوالات در تخصص يك شخص رو پيدا كنم
البته شما گر اره بهتري هم بلد هستيد ممنون ميشم

Felony
جمعه 13 آبان 1390, 14:10 عصر
با استفاده از IN و نوشتن یک SubQuery میتونیدبه هدفتون برسید :

SELECT * FROM Specialty WHERE Title IN (SELECT Tag FROM QuestionTag)

bmanfy
شنبه 14 آبان 1390, 23:06 عصر
ببخشيد من ظاهراه سوال رو يه كمي بد نوشتم. منظور درست منتقل نشده.
دقت كنيد اون مقاديري كه وارد شده همه درون يك فيلد وارد شده هر مقدار از اونها در يك ركورد جدا نيست ها .
به كد هاي زير دقت كنيد :


create table questions(tag nvarchar(50))
create table persons(know nvarchar(50))

insert into persons values('ali reza javad hashem')
insert into questions values('majid hadi reza zahra')
insert into questions values('naser nosrat')
insert into questions values('nader nasrin ali mohsen')


حالا با توجه به تخصصهايي كه شخص داره بايد در بين سوالات جستجو كنه الان بايد سوال اول و سوال سوم رو به عنوان جواب برگردونه
چون در اولي مقدار reza و در سومي مقدار ali رو مشترك دارند

حمیدرضاصادقیان
یک شنبه 15 آبان 1390, 09:12 صبح
سلام.
میدونید با این نوع طراحی چقدر شما باید کدنویسی رو طولانی کنید؟؟؟
میدونید چقدر پیچیدگی کارتون رو زیاد کردید؟
شما با این کار قانون اول نرمال سازی رو نقض کردید.

بهتره جداول به این شکل باشند
جدول Person شامل فیلدهای Id,PersonName
که هر ردیف مربوط به یک اسم هست با یک Id مخصوص.

جدول Questions شامل Id,idPerson,Question باشه.
اینجوری خیلی راحت با یک کد معمولی میتونید به جواب برسید.

bmanfy
دوشنبه 16 آبان 1390, 15:08 عصر
سلام.
میدونید با این نوع طراحی چقدر شما باید کدنویسی رو طولانی کنید؟؟؟
میدونید چقدر پیچیدگی کارتون رو زیاد کردید؟
شما با این کار قانون اول نرمال سازی رو نقض کردید.

بهتره جداول به این شکل باشند
جدول Person شامل فیلدهای Id,PersonName
که هر ردیف مربوط به یک اسم هست با یک Id مخصوص.

جدول Questions شامل Id,idPerson,Question باشه.
اینجوری خیلی راحت با یک کد معمولی میتونید به جواب برسید.

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

شاید منظور شما این باشه که بیام باز یه جدول دیکه بگیریم و در رکورد یک مورد از برچسب ها رو بنویسم.
والا این کار دیگه ای است که میشه انجام داد. که این تصلا قابل قبول نیست اولا که افزونگی اضاقی داره. از طرفی کوئری ها ی اضافی رو تحمیل میکنه .

حالا از همه اینها بگذریم (صورت سوال رو عوض نکنیم ;) ) سوال اصلی من در بالاست . اصلا فرض کنید بحث برچسب و این حرفا نیست . چه طور میشه بر چنین اطلاعاتی یه همچین کوئری نوشت .راهی داره ؟در پست سوم کهملا دقیق توضیح دادو سوال چی به چیه. پست اول شاید کمی ناخوانا باشه .

mehran_sh_t
دوشنبه 16 آبان 1390, 17:33 عصر
من کجا نرمال سازی رو نقض کردم.


اولا که افزونگی اضاقی داره.

نرمال سازی رو که نقض کردید! افزونگی شما هم بیشتره! چون شما احتمالا مقادیر زیادی تکرار رو دارید، فرض کنید کلمه "برنامه نویسی سی شارپ" جزء تخصص ها باشه، و 50% اعضا هم این رو داشته باشن.
افزونگی هم از نرمال سازی نکردن میاد!

اگر هنوز متوجه اشتباه طراحی نشدید، مثال هایی در رابطه با نرمال سازی رو بخونید، مشابه همین سوال شماست.

ولی به قول خودتون، فرض بر این که می خواید همین رو پیاده کنید، از دستور LIKE استفاده کنید فک کنم جواب بده

حمیدرضاصادقیان
سه شنبه 17 آبان 1390, 10:26 صبح
سلام.

من کجا نرمال سازی رو نقض کردم.

اولین نقض این هست که شما در یک فیلد یک مقدار تکی میتونید داشته باشید و اون مقدار نباید بتونه تجزیه بشه.

درمورد جواب سوالتون نیز باید عرض کنم که راه ساده اش استفاده از Like هست که میتونید به مقصود برسید.
ولی نه ایندکس مناسبی میتونید بذارید و روی حجمهای بالاتر قطعا به مشکل برخواهید خورد.
مثلا فرض کنید در برچسب ها بخوانید نام Reza رو به MohammadAli تغییر بدید.
یا فرض کنید این نام رو تغییر دادید در جداول وابسته این تغییرات رو چطوری میخواهید اعمال کنید؟؟

bmanfy
سه شنبه 17 آبان 1390, 20:40 عصر
نرمال سازی رو که نقض کردید! افزونگی شما هم بیشتره! چون شما احتمالا مقادیر زیادی تکرار رو دارید، فرض کنید کلمه "برنامه نویسی سی شارپ" جزء تخصص ها باشه، و 50% اعضا هم این رو داشته باشن.
افزونگی هم از نرمال سازی نکردن میاد!

اگر هنوز متوجه اشتباه طراحی نشدید، مثال هایی در رابطه با نرمال سازی رو بخونید، مشابه همین سوال شماست.

ولی به قول خودتون، فرض بر این که می خواید همین رو پیاده کنید، از دستور LIKE استفاده کنید فک کنم جواب بده

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



اولین نقض این هست که شما در یک فیلد یک مقدار تکی میتونید داشته باشید و اون مقدار نباید بتونه تجزیه بشه.

دوست عزیز این مقدار که داره ثبت میشه کاملا تجزیه ناپذیر هست یک مقدار متنی هست حالا اینکه من خودم میخوام با یک تکنیکی بخش بخش کنم دلیل نمیشه که .....



مثلا فرض کنید در برچسب ها بخوانید نام Reza رو به MohammadAli تغییر بدید.
یا فرض کنید این نام رو تغییر دادید در جداول وابسته این تغییرات رو چطوری میخواهید اعمال کنید؟؟

الان به نظر شما برچسب سوالات تو همین سایت برنامه نویس به چه شکله برای هر سوال؟!!!!!
یه فیلد متنی ساده است فقط . اصلا جدول وابسته ای هم وجود نداره به اونها !!!!!



ولی به قول خودتون، فرض بر این که می خواید همین رو پیاده کنید، از دستور LIKE استفاده کنید فک کنم جواب بده

با like قابل پیاده سازی نیست. یعنی من هرچی فکر میکنم چیزی به نظرم نمیرسه .


شاید دوستان سوال من رو بد متوجه شده باشین. شاید بد گفتم سوالم رو .
اصلا از بحث برچسی ها خارج بشیم بهتره فکر کنم.
بیاید در نظر بگیریم میخوایم همچین کوئری ای داشته باشیم ؟

یک سوال دیگه در همین مورد؟ تو sql تابعی هست که بیاد یک مقدار رشته ای رو بر اساس یک کارکتر خاص تکه تکه کنه؟

حمیدرضاصادقیان
چهارشنبه 18 آبان 1390, 08:39 صبح
تو sql تابعی هست که بیاد یک مقدار رشته ای رو بر اساس یک کارکتر خاص تکه تکه کنه؟

تابعی نیست ، خودتون باید یک تابع برای اینکار بنویسید و مقدار رشته رو تکه تکه کنید.
لینکهای زیر رو ببینید ، شاید مشکلتون رفع بشه.

لینک 1 (http://barnamenevis.org/showthread.php?284784-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%DA%86%D9%86%D8%AF%DB%8C%D9%86-%D9%87%D8%B2%D8%A7%D8%B1-struct&highlight=%D8%AA%D8%AC%D8%B2%DB%8C%D9%87)
لینک 2 (http://www.30sharp.com/ShowArticle.aspx?nid=13&did=224&AuthorID=11)


ولی بازم همچنان بر این عقیده هستم که نرمال سازی رعایت نشده است.
درمورد سایت که فرمودید یک فیلد به عنوان Subject داریم و هیچ وقت نیاز نداریم یک بخش از این رو با فیلد دیگه ای مقایسه کنیم. برای جستجو هم بایک Like اینکارو انجام میدیم.
برای آدرس هم به همین شکل.

درهرصورت امیدوارم با لینکهای بالا مشکلتون حل بشه.

baktash.n81@gmail.com
چهارشنبه 18 آبان 1390, 13:53 عصر
سلام

من زیاد کاری به این که چقدر طراحیت غلطه ندارم ...

اما اگه می خوای یک فیلد متنی رو تیکه تیکه کنی بر اساس یک کاراکتر خاص باید این کارو بکنی اول تو یه حلقه به کمک تابع CharIndex جای کارکتر مورد نظرت رو پیدا کنی . بعد با کمک تابع Substring اون تیکرو استخراج کنی هر وقت هم CharIndex مقدار null برگردوند بری رکورد بعدی ... فقط باید مطمئا بشی که کاربر که داره اطلاعات رو وارد می کنه از کاراکتری که تو بعنوان جدا کننده استفاده می کنی, استفاده نکنه چون منطق برنامت بهم می ریزه ...

ولی استفاده از چند جدول خیلی بهتره ... و اگه خوب طراحی بشه محدودیت هم ایجاد نمی کنه ... یکم از بیرون به مسئله نگاه کن احتمال داره طراحیت اشکال داشته باشه ...

یوسف زالی
چهارشنبه 18 آبان 1390, 16:04 عصر
سلام.
دوست من بهتره براش یک جدول جدا بگیرید. لازم نیست تمام تخصص ها رو از اول وارد کرده باشید.
کافیه برای یوزر فرمی بگذارید تا تخصص هایی که دوست داره رو اضافه کنه.
اما جواب:
اگر مطمئن هستید که جداکننده فاصله قابل اعتماد هست(یعنی اینکه مثلا علی رضا یک اسم نباشه) بهترین راه اینه که با یک حلقه و با استفاده از دستورات رشته ای مثل substring و charindex بیای و تک تک اسامی رو جدا کنی و در جدول موقتی بریزی. این کار رو برای هر دو جدول انجام می دی. بعد با استفاده از دستوراتی مثل in subselect یا intersect اشتراک اونها رو در بیاری.

راه دیگه اینه که یکی از جداول رو پارس کنی (می تونی با توابعی مثل parsname هم این کار رو کنی مشروط به اینکه جداکننده شما space نباشه) و از like استفاده کنی.

فکر کنم متوجه شدی که این که دوستان اصرار دارند طراحی رو اصلاح کنی صلاحتون رو می خوان!
موفق باشی.

bmanfy
چهارشنبه 18 آبان 1390, 22:01 عصر
با سلام.
ممنون از همگی دوستان خوبم . من کوچیک همتون هستم. پافشاری رو درست بودن پیاده سازی ندارم :) بیشتر برام جالب بود چطور میشه این جوری کوئری نوشت.
تا جند لحظه یپش فکر میکردم وقتی تو همین سایت برنامه نویس در قسمت جستجو پیشرفته بر اساس چنتا برچسب جستجو میکنیم بر اساس همه اونها جستجو میکنه و برام جالب بود چطور این طوری انجام میده. که الان متوجه شدم تنها بر اساس اولین برچسب جستجو میکنه :) و باقیشو در نظر نمیگیره
ممنون از همگی